@abloatai/transaction 0.56.0 → 0.58.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 +54 -10
- package/README.md +3 -1
- package/dist/ai-sdk/modelTools.d.ts +3 -3
- package/dist/ai-sdk/modelTools.d.ts.map +1 -1
- package/dist/ai-sdk/modelTools.js +1 -1
- package/dist/ai-sdk/modelTools.js.map +1 -1
- package/dist/ai-sdk/updateTool.d.ts +5 -7
- package/dist/ai-sdk/updateTool.d.ts.map +1 -1
- package/dist/ai-sdk/updateTool.js +3 -5
- package/dist/ai-sdk/updateTool.js.map +1 -1
- package/dist/auth/capability.d.ts +5 -0
- package/dist/auth/capability.d.ts.map +1 -1
- package/dist/auth/capability.js +5 -0
- package/dist/auth/capability.js.map +1 -1
- package/dist/auth/capabilityLifecycle.d.ts +1 -1
- package/dist/auth/capabilityLifecycle.d.ts.map +1 -1
- package/dist/auth/credentialPolicy.d.ts +1 -1
- package/dist/auth/credentialPolicy.d.ts.map +1 -1
- package/dist/auth/identity.d.ts +3 -3
- package/dist/auth/identity.d.ts.map +1 -1
- package/dist/auth/identity.js +5 -5
- package/dist/auth/identity.js.map +1 -1
- package/dist/auth/index.d.ts +4 -208
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +4 -330
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/runtime.d.ts +218 -0
- package/dist/auth/runtime.d.ts.map +1 -0
- package/dist/auth/runtime.js +336 -0
- package/dist/auth/runtime.js.map +1 -0
- package/dist/auth/sessionMint.d.ts +1 -1
- package/dist/auth/sessionMint.d.ts.map +1 -1
- package/dist/auth/sessionMint.js +2 -1
- package/dist/auth/sessionMint.js.map +1 -1
- package/dist/branches.d.ts +25 -21
- package/dist/branches.d.ts.map +1 -1
- package/dist/branches.js +3 -0
- package/dist/branches.js.map +1 -1
- package/dist/{coordination/awaitClaimGrant.d.ts → claims/awaitGrant.d.ts} +1 -1
- package/dist/claims/awaitGrant.d.ts.map +1 -0
- package/dist/{coordination/awaitClaimGrant.js → claims/awaitGrant.js} +4 -4
- package/dist/claims/awaitGrant.js.map +1 -0
- package/dist/{wire/claims.d.ts → claims/contract.d.ts} +1 -1
- package/dist/claims/contract.d.ts.map +1 -0
- package/dist/{wire/claims.js → claims/contract.js} +2 -2
- package/dist/claims/contract.js.map +1 -0
- package/dist/{wire/claimEvent.d.ts → claims/eventContract.d.ts} +1 -1
- package/dist/claims/eventContract.d.ts.map +1 -0
- package/dist/{wire/claimEvent.js → claims/eventContract.js} +1 -1
- package/dist/claims/eventContract.js.map +1 -0
- package/dist/{coordination → claims}/events.d.ts +7 -11
- package/dist/claims/events.d.ts.map +1 -0
- package/dist/claims/events.js +8 -0
- package/dist/claims/events.js.map +1 -0
- package/dist/{coordination/claimHeartbeatLoop.d.ts → claims/heartbeat.d.ts} +1 -1
- package/dist/claims/heartbeat.d.ts.map +1 -0
- package/dist/{coordination/claimHeartbeatLoop.js → claims/heartbeat.js} +1 -1
- package/dist/claims/heartbeat.js.map +1 -0
- package/dist/claims/index.d.ts +17 -0
- package/dist/claims/index.d.ts.map +1 -0
- package/dist/claims/index.js +16 -0
- package/dist/claims/index.js.map +1 -0
- package/dist/claims/lifetime.d.ts +26 -0
- package/dist/claims/lifetime.d.ts.map +1 -0
- package/dist/claims/lifetime.js +62 -0
- package/dist/claims/lifetime.js.map +1 -0
- package/dist/{coordination → claims}/locator.d.ts +1 -1
- package/dist/claims/locator.d.ts.map +1 -0
- package/dist/{coordination → claims}/locator.js +2 -2
- package/dist/claims/locator.js.map +1 -0
- package/dist/{coordination/claimMeta.d.ts → claims/meta.d.ts} +1 -1
- package/dist/claims/meta.d.ts.map +1 -0
- package/dist/{coordination/claimMeta.js → claims/meta.js} +1 -1
- package/dist/claims/meta.js.map +1 -0
- package/dist/claims/routes.d.ts +59 -0
- package/dist/claims/routes.d.ts.map +1 -0
- package/dist/claims/routes.js +69 -0
- package/dist/claims/routes.js.map +1 -0
- package/dist/claims/targetConflict.d.ts.map +1 -0
- package/dist/claims/targetConflict.js.map +1 -0
- package/dist/{coordination → claims}/trace.d.ts +2 -2
- package/dist/claims/trace.d.ts.map +1 -0
- package/dist/{coordination → claims}/trace.js +5 -5
- package/dist/claims/trace.js.map +1 -0
- package/dist/{ablo.d.ts → client/ablo.d.ts} +6 -15
- package/dist/client/ablo.d.ts.map +1 -0
- package/dist/{ablo.js → client/ablo.js} +2 -2
- package/dist/client/ablo.js.map +1 -0
- package/dist/{transactionLayer.d.ts → client/contract.d.ts} +12 -14
- package/dist/client/contract.d.ts.map +1 -0
- package/dist/{transactionLayer.js → client/contract.js} +4 -5
- package/dist/client/contract.js.map +1 -0
- package/dist/{headlessClient.d.ts → client/headless.d.ts} +4 -4
- package/dist/client/headless.d.ts.map +1 -0
- package/dist/{headlessClient.js → client/headless.js} +8 -10
- package/dist/{headlessClient.js.map → client/headless.js.map} +1 -1
- package/dist/client/index.d.ts +11 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +11 -0
- package/dist/client/index.js.map +1 -0
- package/dist/{resources → client/resources}/functionalUpdate.d.ts +4 -4
- package/dist/client/resources/functionalUpdate.d.ts.map +1 -0
- package/dist/{resources → client/resources}/functionalUpdate.js +3 -3
- package/dist/client/resources/functionalUpdate.js.map +1 -0
- package/dist/{resources → client/resources}/httpResources.d.ts +92 -77
- package/dist/client/resources/httpResources.d.ts.map +1 -0
- package/dist/client/resources/httpResources.js +94 -0
- package/dist/client/resources/httpResources.js.map +1 -0
- package/dist/client/resources/modelCreate.d.ts +21 -0
- package/dist/client/resources/modelCreate.d.ts.map +1 -0
- package/dist/client/resources/modelCreate.js +49 -0
- package/dist/client/resources/modelCreate.js.map +1 -0
- package/dist/{resources → client/resources}/modelOperations.d.ts +57 -51
- package/dist/client/resources/modelOperations.d.ts.map +1 -0
- package/dist/{resources → client/resources}/modelOperations.js +1 -1
- package/dist/client/resources/modelOperations.js.map +1 -0
- package/dist/{resources → client/resources}/mutationOptions.d.ts +4 -17
- package/dist/client/resources/mutationOptions.d.ts.map +1 -0
- package/dist/client/resources/mutationOptions.js.map +1 -0
- package/dist/client/resources/where.d.ts.map +1 -0
- package/dist/{resources → client/resources}/where.js +1 -1
- package/dist/client/resources/where.js.map +1 -0
- package/dist/{resources → client/resources}/writeOptionsSchema.d.ts +16 -35
- package/dist/client/resources/writeOptionsSchema.d.ts.map +1 -0
- package/dist/{resources → client/resources}/writeOptionsSchema.js +25 -18
- package/dist/client/resources/writeOptionsSchema.js.map +1 -0
- package/dist/{transactions → commit}/confirmation/commitEnvelope.d.ts +1 -37
- package/dist/commit/confirmation/commitEnvelope.d.ts.map +1 -0
- package/dist/{transactions → commit}/confirmation/commitEnvelope.js +2 -7
- package/dist/commit/confirmation/commitEnvelope.js.map +1 -0
- package/dist/commit/confirmation/httpCommitEnvelope.d.ts.map +1 -0
- package/dist/{transactions → commit}/confirmation/httpCommitEnvelope.js +1 -1
- package/dist/commit/confirmation/httpCommitEnvelope.js.map +1 -0
- package/dist/commit/confirmation/idempotencyKey.d.ts.map +1 -0
- package/dist/commit/confirmation/idempotencyKey.js.map +1 -0
- package/dist/{transactions → commit}/confirmation/pendingWrite.d.ts +2 -33
- package/dist/commit/confirmation/pendingWrite.d.ts.map +1 -0
- package/dist/{transactions → commit}/confirmation/pendingWrite.js +1 -1
- package/dist/commit/confirmation/pendingWrite.js.map +1 -0
- package/dist/commit/contract.d.ts +1404 -0
- package/dist/commit/contract.d.ts.map +1 -0
- package/dist/{wire/commit.js → commit/contract.js} +26 -21
- package/dist/commit/contract.js.map +1 -0
- package/dist/{durableWrites.d.ts → commit/durableWrites.d.ts} +6 -6
- package/dist/commit/durableWrites.d.ts.map +1 -0
- package/dist/{durableWrites.js → commit/durableWrites.js} +5 -5
- package/dist/commit/durableWrites.js.map +1 -0
- package/dist/commit/httpRequest.d.ts +45 -0
- package/dist/commit/httpRequest.d.ts.map +1 -0
- package/dist/commit/httpRequest.js +66 -0
- package/dist/commit/httpRequest.js.map +1 -0
- package/dist/commit/index.d.ts +17 -0
- package/dist/commit/index.d.ts.map +1 -0
- package/dist/commit/index.js +17 -0
- package/dist/commit/index.js.map +1 -0
- package/dist/{readSetContext.d.ts → commit/readSetContext.d.ts} +7 -15
- package/dist/commit/readSetContext.d.ts.map +1 -0
- package/dist/{readSetContext.js → commit/readSetContext.js} +18 -28
- package/dist/commit/readSetContext.js.map +1 -0
- package/dist/{commitRecordRuntime.d.ts → commit/recordRuntime.d.ts} +3 -5
- package/dist/commit/recordRuntime.d.ts.map +1 -0
- package/dist/{commitRecordRuntime.js → commit/recordRuntime.js} +13 -54
- package/dist/commit/recordRuntime.js.map +1 -0
- package/dist/coordination/index.d.ts +6 -8
- package/dist/coordination/index.d.ts.map +1 -1
- package/dist/coordination/index.js +3 -9
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/schema.d.ts +11 -466
- package/dist/coordination/schema.d.ts.map +1 -1
- package/dist/coordination/schema.js +13 -265
- package/dist/coordination/schema.js.map +1 -1
- package/dist/errorCodes.d.ts +16 -9
- package/dist/errorCodes.d.ts.map +1 -1
- package/dist/errorCodes.js +14 -6
- package/dist/errorCodes.js.map +1 -1
- package/dist/errorObservation.d.ts +2 -2
- package/dist/errors.d.ts +3 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +27 -11
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/internal/read-set.d.ts +3 -3
- package/dist/internal/read-set.d.ts.map +1 -1
- package/dist/internal/read-set.js +2 -2
- package/dist/internal/read-set.js.map +1 -1
- package/dist/observability.d.ts +4 -4
- package/dist/observability.d.ts.map +1 -1
- package/dist/observability.js +2 -2
- package/dist/{wire/delta.d.ts → observation/contract.d.ts} +8 -8
- package/dist/observation/contract.d.ts.map +1 -0
- package/dist/{wire/delta.js → observation/contract.js} +3 -3
- package/dist/observation/contract.js.map +1 -0
- package/dist/{wire/feedCursor.d.ts → observation/cursor.d.ts} +1 -1
- package/dist/observation/cursor.d.ts.map +1 -0
- package/dist/{wire/feedCursor.js → observation/cursor.js} +1 -1
- package/dist/observation/cursor.js.map +1 -0
- package/dist/{wire/deltaDelivery.d.ts → observation/deliveryContract.d.ts} +1 -1
- package/dist/observation/deliveryContract.d.ts.map +1 -0
- package/dist/{wire/deltaDelivery.js → observation/deliveryContract.js} +1 -1
- package/dist/observation/deliveryContract.js.map +1 -0
- package/dist/{wire/feedEvent.d.ts → observation/feedContract.d.ts} +10 -10
- package/dist/observation/feedContract.d.ts.map +1 -0
- package/dist/{wire/feedEvent.js → observation/feedContract.js} +4 -4
- package/dist/observation/feedContract.js.map +1 -0
- package/dist/observation/httpFeed.d.ts +4 -0
- package/dist/observation/httpFeed.d.ts.map +1 -0
- package/dist/{transport → observation}/httpFeed.js +1 -1
- package/dist/{transport → observation}/httpFeed.js.map +1 -1
- package/dist/observation/index.d.ts +13 -0
- package/dist/observation/index.d.ts.map +1 -0
- package/dist/observation/index.js +13 -0
- package/dist/observation/index.js.map +1 -0
- package/dist/{log → observation/persistence}/syncDeltaRow.d.ts +8 -8
- package/dist/observation/persistence/syncDeltaRow.d.ts.map +1 -0
- package/dist/{log → observation/persistence}/syncDeltaRow.js +4 -4
- package/dist/observation/persistence/syncDeltaRow.js.map +1 -0
- package/dist/pricing.d.ts +20 -12
- package/dist/pricing.d.ts.map +1 -1
- package/dist/pricing.js +46 -26
- package/dist/pricing.js.map +1 -1
- package/dist/schema/audit.d.ts +15 -0
- package/dist/schema/audit.d.ts.map +1 -0
- package/dist/schema/audit.js +90 -0
- package/dist/schema/audit.js.map +1 -0
- package/dist/schema/ddl.d.ts.map +1 -1
- package/dist/schema/ddl.js +68 -1
- package/dist/schema/ddl.js.map +1 -1
- package/dist/schema/index.d.ts +7 -6
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +6 -7
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/model.d.ts +14 -27
- package/dist/schema/model.d.ts.map +1 -1
- package/dist/schema/model.js +2 -2
- package/dist/schema/model.js.map +1 -1
- package/dist/schema/openapi.d.ts.map +1 -1
- package/dist/schema/openapi.js +149 -8
- package/dist/schema/openapi.js.map +1 -1
- package/dist/schema/roles.d.ts +27 -0
- package/dist/schema/roles.d.ts.map +1 -1
- package/dist/schema/roles.js +40 -0
- package/dist/schema/roles.js.map +1 -1
- package/dist/schema/schema.d.ts +34 -7
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +39 -3
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/serialize.d.ts +5 -5
- package/dist/schema/serialize.d.ts.map +1 -1
- package/dist/schema/serialize.js +5 -5
- package/dist/schema/serialize.js.map +1 -1
- package/dist/schema/subject.d.ts +18 -0
- package/dist/schema/subject.d.ts.map +1 -0
- package/dist/schema/subject.js +27 -0
- package/dist/schema/subject.js.map +1 -0
- package/dist/schema/tenancy.d.ts +1 -1
- package/dist/server/adapter.d.ts +3 -1
- package/dist/server/adapter.d.ts.map +1 -1
- package/dist/server/commit.d.ts +6 -14
- package/dist/server/commit.d.ts.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/readConfig.d.ts +3 -0
- package/dist/server/readConfig.d.ts.map +1 -1
- package/dist/server/readConfig.js +0 -21
- package/dist/server/readConfig.js.map +1 -1
- package/dist/server/storageMode.d.ts +1 -1
- package/dist/source/{adapter.d.ts → adapters/adapter.d.ts} +10 -4
- package/dist/source/adapters/adapter.d.ts.map +1 -0
- package/dist/source/adapters/adapter.js.map +1 -0
- package/dist/source/adapters/adapterFactory.d.ts.map +1 -0
- package/dist/source/{adapterFactory.js → adapters/adapterFactory.js} +1 -1
- package/dist/source/adapters/adapterFactory.js.map +1 -0
- package/dist/source/adapters/adapterProfile.d.ts.map +1 -0
- package/dist/source/adapters/adapterProfile.js.map +1 -0
- package/dist/source/{conformance.d.ts → adapters/conformance.d.ts} +1 -1
- package/dist/source/adapters/conformance.d.ts.map +1 -0
- package/dist/source/{conformance.js → adapters/conformance.js} +1 -1
- package/dist/source/adapters/conformance.js.map +1 -0
- package/dist/source/{contract.d.ts → adapters/contract.d.ts} +20 -75
- package/dist/source/adapters/contract.d.ts.map +1 -0
- package/dist/source/{contract.js → adapters/contract.js} +20 -55
- package/dist/source/adapters/contract.js.map +1 -0
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.d.ts.map +1 -1
- package/dist/source/adapters/drizzle.js +54 -25
- package/dist/source/adapters/drizzle.js.map +1 -1
- package/dist/source/adapters/idempotency.d.ts.map +1 -0
- package/dist/source/{idempotency.js → adapters/idempotency.js} +2 -2
- package/dist/source/adapters/idempotency.js.map +1 -0
- package/dist/source/adapters/index.d.ts +21 -0
- package/dist/source/adapters/index.d.ts.map +1 -0
- package/dist/source/adapters/index.js +21 -0
- package/dist/source/adapters/index.js.map +1 -0
- package/dist/source/adapters/kysely.d.ts +3 -1
- package/dist/source/adapters/kysely.d.ts.map +1 -1
- package/dist/source/adapters/kysely.js +49 -23
- package/dist/source/adapters/kysely.js.map +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +6 -3
- package/dist/source/adapters/kyselyMutationCore.d.ts.map +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +17 -8
- package/dist/source/adapters/kyselyMutationCore.js.map +1 -1
- package/dist/source/adapters/memory.d.ts +3 -3
- package/dist/source/adapters/memory.d.ts.map +1 -1
- package/dist/source/adapters/memory.js +20 -7
- package/dist/source/adapters/memory.js.map +1 -1
- package/dist/source/adapters/migration.d.ts +8 -0
- package/dist/source/adapters/migration.d.ts.map +1 -0
- package/dist/source/adapters/migration.js +9 -0
- package/dist/source/adapters/migration.js.map +1 -0
- package/dist/source/{migrations.d.ts → adapters/migrations.d.ts} +3 -4
- package/dist/source/adapters/migrations.d.ts.map +1 -0
- package/dist/source/{migrations.js → adapters/migrations.js} +4 -31
- package/dist/source/adapters/migrations.js.map +1 -0
- package/dist/source/adapters/prisma.d.ts +1 -1
- package/dist/source/adapters/prisma.d.ts.map +1 -1
- package/dist/source/adapters/prisma.js +75 -30
- package/dist/source/adapters/prisma.js.map +1 -1
- package/dist/source/adapters/subjectAuthorization.d.ts +16 -0
- package/dist/source/adapters/subjectAuthorization.d.ts.map +1 -0
- package/dist/source/adapters/subjectAuthorization.js +126 -0
- package/dist/source/adapters/subjectAuthorization.js.map +1 -0
- package/dist/source/{connector.d.ts → connector/client.d.ts} +6 -1
- package/dist/source/connector/client.d.ts.map +1 -0
- package/dist/source/{connector.js → connector/client.js} +28 -11
- package/dist/source/connector/client.js.map +1 -0
- package/dist/source/connector/index.d.ts +4 -0
- package/dist/source/connector/index.d.ts.map +1 -0
- package/dist/source/connector/index.js +4 -0
- package/dist/source/connector/index.js.map +1 -0
- package/dist/source/{connectorProtocol.d.ts → connector/protocol.d.ts} +8 -1
- package/dist/source/connector/protocol.d.ts.map +1 -0
- package/dist/source/{connectorProtocol.js → connector/protocol.js} +10 -3
- package/dist/source/connector/protocol.js.map +1 -0
- package/dist/source/delivery/index.d.ts +3 -0
- package/dist/source/delivery/index.d.ts.map +1 -0
- package/dist/source/delivery/index.js +3 -0
- package/dist/source/delivery/index.js.map +1 -0
- package/dist/source/{pushQueue.d.ts → delivery/pushQueue.d.ts} +1 -1
- package/dist/source/delivery/pushQueue.d.ts.map +1 -0
- package/dist/source/{pushQueue.js → delivery/pushQueue.js} +1 -1
- package/dist/source/delivery/pushQueue.js.map +1 -0
- package/dist/source/{factory.d.ts → endpoint/factory.d.ts} +9 -3
- package/dist/source/endpoint/factory.d.ts.map +1 -0
- package/dist/source/{factory.js → endpoint/factory.js} +122 -6
- package/dist/source/endpoint/factory.js.map +1 -0
- package/dist/source/endpoint/index.d.ts +5 -0
- package/dist/source/endpoint/index.d.ts.map +1 -0
- package/dist/source/endpoint/index.js +5 -0
- package/dist/source/endpoint/index.js.map +1 -0
- package/dist/source/{next.d.ts → endpoint/next.d.ts} +2 -2
- package/dist/source/endpoint/next.d.ts.map +1 -0
- package/dist/source/{next.js → endpoint/next.js} +1 -1
- package/dist/source/endpoint/next.js.map +1 -0
- package/dist/source/{signing.d.ts → endpoint/signing.d.ts} +1 -1
- package/dist/source/endpoint/signing.d.ts.map +1 -0
- package/dist/source/{signing.js → endpoint/signing.js} +1 -1
- package/dist/source/endpoint/signing.js.map +1 -0
- package/dist/source/index.d.ts +15 -12
- package/dist/source/index.d.ts.map +1 -1
- package/dist/source/index.js +13 -10
- package/dist/source/index.js.map +1 -1
- package/dist/source/outbox/contract.d.ts +50 -0
- package/dist/source/outbox/contract.d.ts.map +1 -0
- package/dist/source/outbox/contract.js +50 -0
- package/dist/source/outbox/contract.js.map +1 -0
- package/dist/source/outbox/envelope.d.ts +9 -0
- package/dist/source/outbox/envelope.d.ts.map +1 -0
- package/dist/source/outbox/envelope.js +36 -0
- package/dist/source/outbox/envelope.js.map +1 -0
- package/dist/source/outbox/index.d.ts +11 -0
- package/dist/source/outbox/index.d.ts.map +1 -0
- package/dist/source/outbox/index.js +11 -0
- package/dist/source/outbox/index.js.map +1 -0
- package/dist/source/outbox/migrations.d.ts +4 -0
- package/dist/source/outbox/migrations.d.ts.map +1 -0
- package/dist/source/outbox/migrations.js +67 -0
- package/dist/source/outbox/migrations.js.map +1 -0
- package/dist/source/outbox/retention.d.ts +3 -0
- package/dist/source/outbox/retention.d.ts.map +1 -0
- package/dist/source/outbox/retention.js +3 -0
- package/dist/source/outbox/retention.js.map +1 -0
- package/dist/source/types.d.ts +59 -10
- package/dist/source/types.d.ts.map +1 -1
- package/dist/source/types.js +2 -0
- package/dist/source/types.js.map +1 -1
- package/dist/syncLog/contract.d.ts +19 -8
- package/dist/syncLog/contract.d.ts.map +1 -1
- package/dist/syncLog/contract.js +19 -6
- package/dist/syncLog/contract.js.map +1 -1
- package/dist/testing/fixtures/httpResponses.d.ts +6 -0
- package/dist/testing/fixtures/httpResponses.d.ts.map +1 -1
- package/dist/testing/fixtures/httpResponses.js +1 -0
- package/dist/testing/fixtures/httpResponses.js.map +1 -1
- package/dist/transport/{credentialLifecycle.d.ts → connection/credentialLifecycle.d.ts} +3 -3
- package/dist/transport/connection/credentialLifecycle.d.ts.map +1 -0
- package/dist/transport/{credentialLifecycle.js → connection/credentialLifecycle.js} +2 -2
- package/dist/transport/connection/credentialLifecycle.js.map +1 -0
- package/dist/transport/connection/index.d.ts +5 -0
- package/dist/transport/connection/index.d.ts.map +1 -0
- package/dist/transport/connection/index.js +5 -0
- package/dist/transport/connection/index.js.map +1 -0
- package/dist/transport/{connectionManager.d.ts → connection/manager.d.ts} +13 -5
- package/dist/transport/connection/manager.d.ts.map +1 -0
- package/dist/transport/{connectionManager.js → connection/manager.js} +6 -4
- package/dist/transport/connection/manager.js.map +1 -0
- package/dist/transport/{networkProbe.d.ts → connection/networkProbe.d.ts} +2 -2
- package/dist/transport/connection/networkProbe.d.ts.map +1 -0
- package/dist/transport/{networkProbe.js → connection/networkProbe.js} +4 -4
- package/dist/transport/connection/networkProbe.js.map +1 -0
- package/dist/transport/{httpClient.d.ts → http/client.d.ts} +32 -44
- package/dist/transport/http/client.d.ts.map +1 -0
- package/dist/transport/{httpClient.js → http/client.js} +96 -105
- package/dist/transport/http/client.js.map +1 -0
- package/dist/transport/http/helpers.d.ts +10 -0
- package/dist/transport/http/helpers.d.ts.map +1 -0
- package/dist/transport/http/helpers.js +46 -0
- package/dist/transport/http/helpers.js.map +1 -0
- package/dist/transport/http/index.d.ts +6 -0
- package/dist/transport/http/index.d.ts.map +1 -0
- package/dist/transport/http/index.js +6 -0
- package/dist/transport/http/index.js.map +1 -0
- package/dist/transport/{httpOptions.d.ts → http/options.d.ts} +7 -7
- package/dist/transport/{httpOptions.d.ts.map → http/options.d.ts.map} +1 -1
- package/dist/transport/{httpOptions.js → http/options.js} +1 -1
- package/dist/transport/http/options.js.map +1 -0
- package/dist/transport/http/subscription.d.ts +16 -0
- package/dist/transport/http/subscription.d.ts.map +1 -0
- package/dist/transport/http/subscription.js +146 -0
- package/dist/transport/http/subscription.js.map +1 -0
- package/dist/transport/{httpTransport.d.ts → http/transport.d.ts} +9 -6
- package/dist/transport/http/transport.d.ts.map +1 -0
- package/dist/transport/{httpTransport.js → http/transport.js} +153 -188
- package/dist/transport/http/transport.js.map +1 -0
- package/dist/transport/index.d.ts +8 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +8 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/{commitFrames.d.ts → websocket/commitFrames.d.ts} +8 -20
- package/dist/transport/websocket/commitFrames.d.ts.map +1 -0
- package/dist/transport/{commitFrames.js → websocket/commitFrames.js} +6 -25
- package/dist/transport/websocket/commitFrames.js.map +1 -0
- package/dist/transport/{wsFrameHandlers.d.ts → websocket/frameHandlers.d.ts} +5 -5
- package/dist/transport/websocket/frameHandlers.d.ts.map +1 -0
- package/dist/transport/{wsFrameHandlers.js → websocket/frameHandlers.js} +10 -51
- package/dist/transport/websocket/frameHandlers.js.map +1 -0
- package/dist/transport/{heartbeat.d.ts → websocket/heartbeat.d.ts} +1 -1
- package/dist/transport/websocket/heartbeat.d.ts.map +1 -0
- package/dist/transport/{heartbeat.js → websocket/heartbeat.js} +2 -2
- package/dist/transport/websocket/heartbeat.js.map +1 -0
- package/dist/transport/websocket/index.d.ts +6 -0
- package/dist/transport/websocket/index.d.ts.map +1 -0
- package/dist/transport/websocket/index.js +6 -0
- package/dist/transport/websocket/index.js.map +1 -0
- package/dist/transport/{wsTransport.d.ts → websocket/transport.d.ts} +13 -25
- package/dist/transport/websocket/transport.d.ts.map +1 -0
- package/dist/transport/{wsTransport.js → websocket/transport.js} +14 -14
- package/dist/transport/websocket/transport.js.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/streams.d.ts +8 -48
- package/dist/types/streams.d.ts.map +1 -1
- package/dist/types/streams.js +2 -2
- package/dist/wire/accountResponses.d.ts +4 -72
- package/dist/wire/accountResponses.d.ts.map +1 -1
- package/dist/wire/accountResponses.js +2 -10
- package/dist/wire/accountResponses.js.map +1 -1
- package/dist/wire/apiLifecycle.d.ts +63 -0
- package/dist/wire/apiLifecycle.d.ts.map +1 -0
- package/dist/wire/apiLifecycle.js +89 -0
- package/dist/wire/apiLifecycle.js.map +1 -0
- package/dist/wire/frames.d.ts +6 -83
- package/dist/wire/frames.d.ts.map +1 -1
- package/dist/wire/frames.js +4 -11
- package/dist/wire/frames.js.map +1 -1
- package/dist/wire/inboundFrames.d.ts +6 -131
- package/dist/wire/inboundFrames.d.ts.map +1 -1
- package/dist/wire/inboundFrames.js +3 -3
- package/dist/wire/inboundFrames.js.map +1 -1
- package/dist/wire/index.d.ts +20 -15
- package/dist/wire/index.d.ts.map +1 -1
- package/dist/wire/index.js +22 -8
- package/dist/wire/index.js.map +1 -1
- package/dist/wire/modelMutations.d.ts +1 -32
- package/dist/wire/modelMutations.d.ts.map +1 -1
- package/dist/wire/modelMutations.js +1 -8
- package/dist/wire/modelMutations.js.map +1 -1
- package/dist/wire/rateLimit.d.ts +82 -0
- package/dist/wire/rateLimit.d.ts.map +1 -0
- package/dist/wire/rateLimit.js +142 -0
- package/dist/wire/rateLimit.js.map +1 -0
- package/package.json +130 -10
- package/src/ai-sdk/modelTools.ts +5 -5
- package/src/ai-sdk/updateTool.ts +5 -7
- package/src/auth/capability.ts +5 -0
- package/src/auth/capabilityLifecycle.ts +1 -1
- package/src/auth/credentialPolicy.ts +1 -1
- package/src/auth/identity.ts +7 -7
- package/src/auth/index.ts +4 -663
- package/src/auth/runtime.ts +669 -0
- package/src/auth/sessionMint.ts +3 -2
- package/src/branches.ts +3 -0
- package/src/{coordination/awaitClaimGrant.ts → claims/awaitGrant.ts} +4 -4
- package/src/{wire/claims.ts → claims/contract.ts} +1 -1
- package/src/{coordination → claims}/events.ts +7 -11
- package/src/claims/index.ts +21 -0
- package/src/claims/lifetime.ts +78 -0
- package/src/{coordination → claims}/locator.ts +3 -3
- package/src/claims/routes.ts +81 -0
- package/src/{coordination → claims}/trace.ts +5 -5
- package/src/{ablo.ts → client/ablo.ts} +8 -20
- package/src/{transactionLayer.ts → client/contract.ts} +11 -13
- package/src/{headlessClient.ts → client/headless.ts} +13 -15
- package/src/client/index.ts +10 -0
- package/src/{resources → client/resources}/functionalUpdate.ts +4 -4
- package/src/{resources → client/resources}/httpResources.ts +163 -92
- package/src/client/resources/modelCreate.ts +73 -0
- package/src/{resources → client/resources}/modelOperations.ts +73 -55
- package/src/{resources → client/resources}/mutationOptions.ts +4 -17
- package/src/{resources → client/resources}/where.ts +1 -1
- package/src/{resources → client/resources}/writeOptionsSchema.ts +35 -27
- package/src/{transactions → commit}/confirmation/commitEnvelope.ts +2 -12
- package/src/{transactions → commit}/confirmation/httpCommitEnvelope.ts +1 -1
- package/src/{transactions → commit}/confirmation/pendingWrite.ts +1 -1
- package/src/{wire/commit.ts → commit/contract.ts} +27 -26
- package/src/{durableWrites.ts → commit/durableWrites.ts} +7 -7
- package/src/commit/httpRequest.ts +103 -0
- package/src/commit/index.ts +16 -0
- package/src/{readSetContext.ts → commit/readSetContext.ts} +24 -43
- package/src/{commitRecordRuntime.ts → commit/recordRuntime.ts} +12 -67
- package/src/coordination/index.ts +4 -54
- package/src/coordination/schema.ts +15 -309
- package/src/errorCodes.ts +62 -10
- package/src/errors.ts +32 -10
- package/src/index.ts +8 -8
- package/src/internal/read-set.ts +3 -6
- package/src/observability.ts +4 -4
- package/src/{wire/delta.ts → observation/contract.ts} +2 -2
- package/src/{wire/feedEvent.ts → observation/feedContract.ts} +3 -4
- package/src/{transport → observation}/httpFeed.ts +3 -3
- package/src/observation/index.ts +12 -0
- package/src/{log → observation/persistence}/syncDeltaRow.ts +6 -7
- package/src/pricing.ts +46 -25
- package/src/schema/audit.ts +121 -0
- package/src/schema/ddl.ts +71 -1
- package/src/schema/index.ts +20 -20
- package/src/schema/model.ts +17 -33
- package/src/schema/openapi.ts +170 -9
- package/src/schema/roles.ts +53 -0
- package/src/schema/schema.ts +91 -6
- package/src/schema/serialize.ts +8 -9
- package/src/schema/subject.ts +43 -0
- package/src/server/adapter.ts +3 -1
- package/src/server/commit.ts +6 -14
- package/src/server/index.ts +1 -1
- package/src/server/readConfig.ts +4 -0
- package/src/source/{adapter.ts → adapters/adapter.ts} +9 -5
- package/src/source/{adapterFactory.ts → adapters/adapterFactory.ts} +1 -1
- package/src/source/{conformance.ts → adapters/conformance.ts} +1 -1
- package/src/source/{contract.ts → adapters/contract.ts} +24 -61
- package/src/source/adapters/drizzle.ts +75 -29
- package/src/source/{idempotency.ts → adapters/idempotency.ts} +2 -2
- package/src/source/adapters/index.ts +20 -0
- package/src/source/adapters/kysely.ts +77 -27
- package/src/source/adapters/kyselyMutationCore.ts +23 -11
- package/src/source/adapters/memory.ts +26 -9
- package/src/source/adapters/migration.ts +11 -0
- package/src/source/{migrations.ts → adapters/migrations.ts} +6 -33
- package/src/source/adapters/prisma.ts +98 -34
- package/src/source/adapters/subjectAuthorization.ts +182 -0
- package/src/source/{connector.ts → connector/client.ts} +35 -12
- package/src/source/connector/index.ts +3 -0
- package/src/source/{connectorProtocol.ts → connector/protocol.ts} +10 -2
- package/src/source/delivery/index.ts +2 -0
- package/src/source/{pushQueue.ts → delivery/pushQueue.ts} +2 -2
- package/src/source/{factory.ts → endpoint/factory.ts} +150 -9
- package/src/source/endpoint/index.ts +4 -0
- package/src/source/{next.ts → endpoint/next.ts} +2 -2
- package/src/source/{signing.ts → endpoint/signing.ts} +1 -1
- package/src/source/index.ts +27 -18
- package/src/source/outbox/contract.ts +56 -0
- package/src/source/outbox/envelope.ts +47 -0
- package/src/source/outbox/index.ts +15 -0
- package/src/source/outbox/migrations.ts +71 -0
- package/src/source/outbox/retention.ts +2 -0
- package/src/source/types.ts +64 -10
- package/src/syncLog/contract.ts +19 -9
- package/src/testing/fixtures/httpResponses.ts +7 -0
- package/src/transport/{credentialLifecycle.ts → connection/credentialLifecycle.ts} +3 -3
- package/src/transport/connection/index.ts +4 -0
- package/src/transport/{connectionManager.ts → connection/manager.ts} +13 -4
- package/src/transport/{networkProbe.ts → connection/networkProbe.ts} +4 -4
- package/src/transport/{httpClient.ts → http/client.ts} +165 -184
- package/src/transport/http/helpers.ts +63 -0
- package/src/transport/http/index.ts +5 -0
- package/src/transport/{httpOptions.ts → http/options.ts} +6 -6
- package/src/transport/http/subscription.ts +174 -0
- package/src/transport/{httpTransport.ts → http/transport.ts} +210 -246
- package/src/transport/index.ts +7 -0
- package/src/transport/{commitFrames.ts → websocket/commitFrames.ts} +14 -46
- package/src/transport/{wsFrameHandlers.ts → websocket/frameHandlers.ts} +11 -54
- package/src/transport/{heartbeat.ts → websocket/heartbeat.ts} +2 -2
- package/src/transport/websocket/index.ts +5 -0
- package/src/transport/{wsTransport.ts → websocket/transport.ts} +16 -30
- package/src/types/index.ts +2 -6
- package/src/types/streams.ts +7 -61
- package/src/webhooks/events.ts +1 -1
- package/src/wire/accountResponses.ts +3 -12
- package/src/wire/apiLifecycle.ts +94 -0
- package/src/wire/frames.ts +5 -15
- package/src/wire/inboundFrames.ts +3 -3
- package/src/wire/index.ts +50 -15
- package/src/wire/modelMutations.ts +1 -14
- package/src/wire/rateLimit.ts +155 -0
- package/dist/ablo.d.ts.map +0 -1
- package/dist/ablo.js.map +0 -1
- package/dist/commitRecordRuntime.d.ts.map +0 -1
- package/dist/commitRecordRuntime.js.map +0 -1
- package/dist/coordination/awaitClaimGrant.d.ts.map +0 -1
- package/dist/coordination/awaitClaimGrant.js.map +0 -1
- package/dist/coordination/claimHeartbeatLoop.d.ts.map +0 -1
- package/dist/coordination/claimHeartbeatLoop.js.map +0 -1
- package/dist/coordination/claimMeta.d.ts.map +0 -1
- package/dist/coordination/claimMeta.js.map +0 -1
- package/dist/coordination/events.d.ts.map +0 -1
- package/dist/coordination/events.js +0 -8
- package/dist/coordination/events.js.map +0 -1
- package/dist/coordination/locator.d.ts.map +0 -1
- package/dist/coordination/locator.js.map +0 -1
- package/dist/coordination/targetConflict.d.ts.map +0 -1
- package/dist/coordination/targetConflict.js.map +0 -1
- package/dist/coordination/trace.d.ts.map +0 -1
- package/dist/coordination/trace.js.map +0 -1
- package/dist/durableWrites.d.ts.map +0 -1
- package/dist/durableWrites.js.map +0 -1
- package/dist/headlessClient.d.ts.map +0 -1
- package/dist/log/syncDeltaRow.d.ts.map +0 -1
- package/dist/log/syncDeltaRow.js.map +0 -1
- package/dist/policy/types.d.ts +0 -226
- package/dist/policy/types.d.ts.map +0 -1
- package/dist/policy/types.js +0 -127
- package/dist/policy/types.js.map +0 -1
- package/dist/readSetContext.d.ts.map +0 -1
- package/dist/readSetContext.js.map +0 -1
- package/dist/resources/functionalUpdate.d.ts.map +0 -1
- package/dist/resources/functionalUpdate.js.map +0 -1
- package/dist/resources/httpResources.d.ts.map +0 -1
- package/dist/resources/httpResources.js +0 -17
- package/dist/resources/httpResources.js.map +0 -1
- package/dist/resources/modelOperations.d.ts.map +0 -1
- package/dist/resources/modelOperations.js.map +0 -1
- package/dist/resources/mutationOptions.d.ts.map +0 -1
- package/dist/resources/mutationOptions.js.map +0 -1
- package/dist/resources/where.d.ts.map +0 -1
- package/dist/resources/where.js.map +0 -1
- package/dist/resources/writeOptionsSchema.d.ts.map +0 -1
- package/dist/resources/writeOptionsSchema.js.map +0 -1
- package/dist/schema/coordination.d.ts +0 -113
- package/dist/schema/coordination.d.ts.map +0 -1
- package/dist/schema/coordination.js +0 -134
- package/dist/schema/coordination.js.map +0 -1
- package/dist/source/adapter.d.ts.map +0 -1
- package/dist/source/adapter.js.map +0 -1
- package/dist/source/adapterFactory.d.ts.map +0 -1
- package/dist/source/adapterFactory.js.map +0 -1
- package/dist/source/adapterProfile.d.ts.map +0 -1
- package/dist/source/adapterProfile.js.map +0 -1
- package/dist/source/conformance.d.ts.map +0 -1
- package/dist/source/conformance.js.map +0 -1
- package/dist/source/connector.d.ts.map +0 -1
- package/dist/source/connector.js.map +0 -1
- package/dist/source/connectorProtocol.d.ts.map +0 -1
- package/dist/source/connectorProtocol.js.map +0 -1
- package/dist/source/contract.d.ts.map +0 -1
- package/dist/source/contract.js.map +0 -1
- package/dist/source/drizzle.d.ts +0 -2
- package/dist/source/drizzle.d.ts.map +0 -1
- package/dist/source/drizzle.js +0 -2
- package/dist/source/drizzle.js.map +0 -1
- package/dist/source/factory.d.ts.map +0 -1
- package/dist/source/factory.js.map +0 -1
- package/dist/source/idempotency.d.ts.map +0 -1
- package/dist/source/idempotency.js.map +0 -1
- package/dist/source/kysely.d.ts +0 -3
- package/dist/source/kysely.d.ts.map +0 -1
- package/dist/source/kysely.js +0 -3
- package/dist/source/kysely.js.map +0 -1
- package/dist/source/migrations.d.ts.map +0 -1
- package/dist/source/migrations.js.map +0 -1
- package/dist/source/next.d.ts.map +0 -1
- package/dist/source/next.js.map +0 -1
- package/dist/source/pushQueue.d.ts.map +0 -1
- package/dist/source/pushQueue.js.map +0 -1
- package/dist/source/signing.d.ts.map +0 -1
- package/dist/source/signing.js.map +0 -1
- package/dist/transactionLayer.d.ts.map +0 -1
- package/dist/transactionLayer.js.map +0 -1
- package/dist/transactions/confirmation/commitEnvelope.d.ts.map +0 -1
- package/dist/transactions/confirmation/commitEnvelope.js.map +0 -1
- package/dist/transactions/confirmation/httpCommitEnvelope.d.ts.map +0 -1
- package/dist/transactions/confirmation/httpCommitEnvelope.js.map +0 -1
- package/dist/transactions/confirmation/idempotencyKey.d.ts.map +0 -1
- package/dist/transactions/confirmation/idempotencyKey.js.map +0 -1
- package/dist/transactions/confirmation/pendingWrite.d.ts.map +0 -1
- package/dist/transactions/confirmation/pendingWrite.js.map +0 -1
- package/dist/transport/commitFrames.d.ts.map +0 -1
- package/dist/transport/commitFrames.js.map +0 -1
- package/dist/transport/connectionManager.d.ts.map +0 -1
- package/dist/transport/connectionManager.js.map +0 -1
- package/dist/transport/credentialLifecycle.d.ts.map +0 -1
- package/dist/transport/credentialLifecycle.js.map +0 -1
- package/dist/transport/heartbeat.d.ts.map +0 -1
- package/dist/transport/heartbeat.js.map +0 -1
- package/dist/transport/httpClient.d.ts.map +0 -1
- package/dist/transport/httpClient.js.map +0 -1
- package/dist/transport/httpFeed.d.ts +0 -4
- package/dist/transport/httpFeed.d.ts.map +0 -1
- package/dist/transport/httpOptions.js.map +0 -1
- package/dist/transport/httpTransport.d.ts.map +0 -1
- package/dist/transport/httpTransport.js.map +0 -1
- package/dist/transport/networkProbe.d.ts.map +0 -1
- package/dist/transport/networkProbe.js.map +0 -1
- package/dist/transport/wsFrameHandlers.d.ts.map +0 -1
- package/dist/transport/wsFrameHandlers.js.map +0 -1
- package/dist/transport/wsTransport.d.ts.map +0 -1
- package/dist/transport/wsTransport.js.map +0 -1
- package/dist/wire/claimEvent.d.ts.map +0 -1
- package/dist/wire/claimEvent.js.map +0 -1
- package/dist/wire/claims.d.ts.map +0 -1
- package/dist/wire/claims.js.map +0 -1
- package/dist/wire/commit.d.ts +0 -2801
- package/dist/wire/commit.d.ts.map +0 -1
- package/dist/wire/commit.js.map +0 -1
- package/dist/wire/delta.d.ts.map +0 -1
- package/dist/wire/delta.js.map +0 -1
- package/dist/wire/deltaDelivery.d.ts.map +0 -1
- package/dist/wire/deltaDelivery.js.map +0 -1
- package/dist/wire/feedCursor.d.ts.map +0 -1
- package/dist/wire/feedCursor.js.map +0 -1
- package/dist/wire/feedEvent.d.ts.map +0 -1
- package/dist/wire/feedEvent.js.map +0 -1
- package/src/policy/types.ts +0 -300
- package/src/schema/coordination.ts +0 -161
- package/src/source/drizzle.ts +0 -1
- package/src/source/kysely.ts +0 -2
- /package/dist/{coordination → claims}/targetConflict.d.ts +0 -0
- /package/dist/{coordination → claims}/targetConflict.js +0 -0
- /package/dist/{resources → client/resources}/mutationOptions.js +0 -0
- /package/dist/{resources → client/resources}/where.d.ts +0 -0
- /package/dist/{transactions → commit}/confirmation/httpCommitEnvelope.d.ts +0 -0
- /package/dist/{transactions → commit}/confirmation/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → commit}/confirmation/idempotencyKey.js +0 -0
- /package/dist/source/{adapter.js → adapters/adapter.js} +0 -0
- /package/dist/source/{adapterFactory.d.ts → adapters/adapterFactory.d.ts} +0 -0
- /package/dist/source/{adapterProfile.d.ts → adapters/adapterProfile.d.ts} +0 -0
- /package/dist/source/{adapterProfile.js → adapters/adapterProfile.js} +0 -0
- /package/dist/source/{idempotency.d.ts → adapters/idempotency.d.ts} +0 -0
- /package/src/{wire/claimEvent.ts → claims/eventContract.ts} +0 -0
- /package/src/{coordination/claimHeartbeatLoop.ts → claims/heartbeat.ts} +0 -0
- /package/src/{coordination/claimMeta.ts → claims/meta.ts} +0 -0
- /package/src/{coordination → claims}/targetConflict.ts +0 -0
- /package/src/{transactions → commit}/confirmation/idempotencyKey.ts +0 -0
- /package/src/{wire/feedCursor.ts → observation/cursor.ts} +0 -0
- /package/src/{wire/deltaDelivery.ts → observation/deliveryContract.ts} +0 -0
- /package/src/source/{adapterProfile.ts → adapters/adapterProfile.ts} +0 -0
|
@@ -24,28 +24,40 @@ import type {
|
|
|
24
24
|
DataSourceAdapter,
|
|
25
25
|
MutationAdapter,
|
|
26
26
|
Row,
|
|
27
|
-
} from '
|
|
28
|
-
import { defineDatabaseAdapter } from '
|
|
29
|
-
import { postgresAdapterProfile } from '
|
|
30
|
-
import type { ChangeSet
|
|
27
|
+
} from './adapter.js';
|
|
28
|
+
import { defineDatabaseAdapter } from './adapterFactory.js';
|
|
29
|
+
import { postgresAdapterProfile } from './adapterProfile.js';
|
|
30
|
+
import type { ChangeSet } from './contract.js';
|
|
31
|
+
import type { Migration } from './migration.js';
|
|
31
32
|
import {
|
|
32
33
|
changeSetSchema,
|
|
33
|
-
outboxEventSchema,
|
|
34
34
|
sourceCommitEchoMarkerSchema,
|
|
35
35
|
sourceCommitEchoIntentSchema,
|
|
36
36
|
type SourceCommitEchoIntent,
|
|
37
|
-
} from '
|
|
37
|
+
} from './contract.js';
|
|
38
38
|
import {
|
|
39
39
|
assertSourceIdempotencyIntent,
|
|
40
40
|
assertSourceIdempotencyRetention,
|
|
41
41
|
sourceChangeIntentHash,
|
|
42
42
|
SOURCE_IDEMPOTENCY_RETENTION,
|
|
43
|
-
} from '
|
|
43
|
+
} from './idempotency.js';
|
|
44
44
|
import {
|
|
45
45
|
adapterTableMigrations,
|
|
46
46
|
idempotencyLedgerMigrations,
|
|
47
|
-
} from '
|
|
47
|
+
} from './migrations.js';
|
|
48
48
|
import { ABLO_POSTGRES_COMMIT_ECHO_PREFIX } from '../types.js';
|
|
49
|
+
import {
|
|
50
|
+
authorizeSourceChange,
|
|
51
|
+
authorizeSourceRead,
|
|
52
|
+
lockSourceSubjectCreates,
|
|
53
|
+
rethrowStrictCreateConflict,
|
|
54
|
+
sourceSyncGroups,
|
|
55
|
+
} from './subjectAuthorization.js';
|
|
56
|
+
import {
|
|
57
|
+
decodeDatabaseOutboxEvent,
|
|
58
|
+
ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE,
|
|
59
|
+
type EventsPage,
|
|
60
|
+
} from '../outbox/index.js';
|
|
49
61
|
import {
|
|
50
62
|
createKyselyMutationCore,
|
|
51
63
|
kyselyOperationRowId,
|
|
@@ -259,6 +271,8 @@ export interface KyselyMutationAdapterOptions {
|
|
|
259
271
|
* typenames equal its keys.
|
|
260
272
|
*/
|
|
261
273
|
readonly markerModelFor?: (operationModel: string) => string;
|
|
274
|
+
/** Schema required to enforce row/subject authorization in this adapter. */
|
|
275
|
+
readonly schema?: Schema;
|
|
262
276
|
}
|
|
263
277
|
|
|
264
278
|
export function createKyselyMutationAdapter(
|
|
@@ -287,8 +301,9 @@ export function createKyselyMutationAdapter(
|
|
|
287
301
|
: idempotencyLedgerMigrations();
|
|
288
302
|
},
|
|
289
303
|
|
|
290
|
-
read(request) {
|
|
291
|
-
|
|
304
|
+
async read(request) {
|
|
305
|
+
const rows = await core.read(request);
|
|
306
|
+
return options.schema ? authorizeSourceRead(options.schema, request, rows) : rows;
|
|
292
307
|
},
|
|
293
308
|
|
|
294
309
|
async commit(change: ChangeSet): Promise<AdapterCommitResult> {
|
|
@@ -326,6 +341,25 @@ export function createKyselyMutationAdapter(
|
|
|
326
341
|
return { rows: parseCachedRows(cachedRow.response) };
|
|
327
342
|
}
|
|
328
343
|
|
|
344
|
+
if (options.schema) {
|
|
345
|
+
await lockSourceSubjectCreates(options.schema, request, async (_operation, key) => {
|
|
346
|
+
await transaction.executeQuery(rawQuery(
|
|
347
|
+
'subject-create-lock',
|
|
348
|
+
'SELECT pg_advisory_xact_lock(hashtextextended($1, 0))',
|
|
349
|
+
[key],
|
|
350
|
+
));
|
|
351
|
+
});
|
|
352
|
+
await authorizeSourceChange(options.schema, request, async (operation) => {
|
|
353
|
+
if (!operation.id) return null;
|
|
354
|
+
const rows = await core.read(
|
|
355
|
+
{ kind: 'load', model: operation.model, id: operation.id },
|
|
356
|
+
transaction,
|
|
357
|
+
{ forUpdate: true },
|
|
358
|
+
);
|
|
359
|
+
return rows[0] ?? null;
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
|
|
329
363
|
// Direct mode dispatches every operation before awaiting any of them, so
|
|
330
364
|
// the driver pipelines them into one trip instead of paying a full
|
|
331
365
|
// round trip per row. Postgres still executes them IN ORDER on the
|
|
@@ -339,9 +373,17 @@ export function createKyselyMutationAdapter(
|
|
|
339
373
|
// returned row, so operation i+1's write cannot be dispatched before
|
|
340
374
|
// operation i has answered.
|
|
341
375
|
const rows: Row[] = [];
|
|
376
|
+
const applyStrict = async (operation: ChangeSet['operations'][number]): Promise<Row> => {
|
|
377
|
+
try {
|
|
378
|
+
return await core.applyOperation(transaction, operation);
|
|
379
|
+
} catch (error) {
|
|
380
|
+
if (operation.type === 'CREATE') rethrowStrictCreateConflict(error, operation);
|
|
381
|
+
throw error;
|
|
382
|
+
}
|
|
383
|
+
};
|
|
342
384
|
if (mode === 'direct') {
|
|
343
385
|
const dispatched = request.operations.map((operation) =>
|
|
344
|
-
|
|
386
|
+
applyStrict(operation),
|
|
345
387
|
);
|
|
346
388
|
// Settle every dispatch before inspecting, so a later rejection is
|
|
347
389
|
// never an unhandled rejection, then surface the FIRST failure in
|
|
@@ -354,7 +396,7 @@ export function createKyselyMutationAdapter(
|
|
|
354
396
|
}
|
|
355
397
|
} else {
|
|
356
398
|
for (const [index, operation] of request.operations.entries()) {
|
|
357
|
-
const row = await
|
|
399
|
+
const row = await applyStrict(operation);
|
|
358
400
|
rows.push(row);
|
|
359
401
|
|
|
360
402
|
const entityId = String(row.id ?? kyselyOperationRowId(operation));
|
|
@@ -366,6 +408,10 @@ export function createKyselyMutationAdapter(
|
|
|
366
408
|
entity_id: entityId,
|
|
367
409
|
type: operation.type,
|
|
368
410
|
data: operation.type === 'DELETE' ? null : JSON.stringify(row),
|
|
411
|
+
event_version: 2,
|
|
412
|
+
sync_groups: options.schema
|
|
413
|
+
? sourceSyncGroups(options.schema, operation.model, row)
|
|
414
|
+
: [],
|
|
369
415
|
correlation_id: request.correlationId,
|
|
370
416
|
transaction_id: operation.transactionId ?? null,
|
|
371
417
|
occurred_at: Date.now(),
|
|
@@ -402,12 +448,29 @@ export function kyselyDataSource<S extends SchemaRecord>(
|
|
|
402
448
|
db,
|
|
403
449
|
createKyselyMutationCore(db, schema),
|
|
404
450
|
'endpoint',
|
|
451
|
+
{ schema },
|
|
405
452
|
);
|
|
406
453
|
|
|
407
454
|
return defineDatabaseAdapter({
|
|
408
455
|
...mutation,
|
|
409
456
|
capabilities: { ...mutation.capabilities, outboxEvents: true },
|
|
410
457
|
|
|
458
|
+
async acknowledgeEvents(acknowledgedThrough: string): Promise<void> {
|
|
459
|
+
await db.transaction().execute(async (transaction) => {
|
|
460
|
+
await transaction.executeQuery(
|
|
461
|
+
rawQuery(
|
|
462
|
+
'ablo-outbox-prune-acknowledged',
|
|
463
|
+
`DELETE FROM ablo_outbox
|
|
464
|
+
WHERE cursor IN (
|
|
465
|
+
SELECT cursor FROM ablo_outbox
|
|
466
|
+
WHERE cursor <= $1 ORDER BY cursor ASC LIMIT $2
|
|
467
|
+
)`,
|
|
468
|
+
[acknowledgedThrough, ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE],
|
|
469
|
+
),
|
|
470
|
+
);
|
|
471
|
+
});
|
|
472
|
+
},
|
|
473
|
+
|
|
411
474
|
async events(cursor: string | null, limit: number): Promise<EventsPage> {
|
|
412
475
|
const rows = await db
|
|
413
476
|
.selectFrom('ablo_outbox')
|
|
@@ -416,21 +479,7 @@ export function kyselyDataSource<S extends SchemaRecord>(
|
|
|
416
479
|
.orderBy('cursor', 'asc')
|
|
417
480
|
.limit(limit)
|
|
418
481
|
.execute();
|
|
419
|
-
const events = rows.map(
|
|
420
|
-
outboxEventSchema.parse({
|
|
421
|
-
id: row.id,
|
|
422
|
-
model: row.model,
|
|
423
|
-
entityId: row.entity_id,
|
|
424
|
-
type: row.type,
|
|
425
|
-
data: typeof row.data === 'string' ? JSON.parse(row.data) : row.data ?? null,
|
|
426
|
-
organizationId: row.organization_id ?? null,
|
|
427
|
-
clientTxId: row.client_tx_id ?? null,
|
|
428
|
-
correlationId: row.correlation_id ?? null,
|
|
429
|
-
transactionId: row.transaction_id ?? null,
|
|
430
|
-
occurredAt: row.occurred_at != null ? Number(row.occurred_at) : null,
|
|
431
|
-
cursor: String(row.cursor),
|
|
432
|
-
}),
|
|
433
|
-
);
|
|
482
|
+
const events = rows.map(decodeDatabaseOutboxEvent);
|
|
434
483
|
return { events, nextCursor: events.at(-1)?.cursor ?? null };
|
|
435
484
|
},
|
|
436
485
|
});
|
|
@@ -458,6 +507,7 @@ export function kyselyDirectMutation<S extends SchemaRecord>(
|
|
|
458
507
|
markerModels.get(operationModel) ??
|
|
459
508
|
markerModels.get(operationModel.toLowerCase()) ??
|
|
460
509
|
operationModel,
|
|
510
|
+
schema,
|
|
461
511
|
},
|
|
462
512
|
);
|
|
463
513
|
}
|
|
@@ -13,8 +13,9 @@ import type { Schema, SchemaRecord } from '../../schema/schema.js';
|
|
|
13
13
|
import { toSchemaJSON } from '../../schema/serialize.js';
|
|
14
14
|
import { camelToSnake, snakeToCamel } from '../../schema/ddl.js';
|
|
15
15
|
import { tenancyColumn } from '../../schema/tenancy.js';
|
|
16
|
-
import type { AdapterReadRequest, Row } from '
|
|
17
|
-
import type { Operation } from '
|
|
16
|
+
import type { AdapterReadRequest, Row } from './adapter.js';
|
|
17
|
+
import type { Operation } from './contract.js';
|
|
18
|
+
import { sourceSubjectRule, sourceSubjectValues } from './subjectAuthorization.js';
|
|
18
19
|
|
|
19
20
|
/** The subset of a Kysely instance, or transaction handle, used by the core. */
|
|
20
21
|
export interface KyselyLike {
|
|
@@ -48,6 +49,7 @@ export interface KyselySelectBuilder {
|
|
|
48
49
|
where(column: string, operator: string, value: unknown): KyselySelectBuilder;
|
|
49
50
|
orderBy(column: string, direction: 'asc' | 'desc'): KyselySelectBuilder;
|
|
50
51
|
limit(limit: number): KyselySelectBuilder;
|
|
52
|
+
forUpdate(): KyselySelectBuilder;
|
|
51
53
|
execute(): Promise<readonly Row[]>;
|
|
52
54
|
}
|
|
53
55
|
|
|
@@ -140,7 +142,11 @@ function suppliedOperationRowId(operation: Operation): string | undefined {
|
|
|
140
142
|
|
|
141
143
|
/** The transport-independent Kysely field/column mutation boundary. */
|
|
142
144
|
export interface KyselyMutationCore {
|
|
143
|
-
read(
|
|
145
|
+
read(
|
|
146
|
+
request: AdapterReadRequest,
|
|
147
|
+
database?: KyselyLike,
|
|
148
|
+
options?: { readonly forUpdate?: boolean },
|
|
149
|
+
): Promise<readonly Row[]>;
|
|
144
150
|
applyOperation(transaction: KyselyLike, operation: Operation): Promise<Row>;
|
|
145
151
|
}
|
|
146
152
|
|
|
@@ -185,22 +191,28 @@ export function createKyselyMutationCore<S extends SchemaRecord>(
|
|
|
185
191
|
};
|
|
186
192
|
|
|
187
193
|
return {
|
|
188
|
-
async read(request): Promise<readonly Row[]> {
|
|
194
|
+
async read(request, database = db, options): Promise<readonly Row[]> {
|
|
189
195
|
const columns = modelColumns(request.model);
|
|
190
196
|
if (request.kind === 'load') {
|
|
191
|
-
|
|
197
|
+
let query = database
|
|
192
198
|
.selectFrom(columns.table)
|
|
193
199
|
.selectAll()
|
|
194
200
|
.where(columnFor(columns, 'id'), '=', request.id)
|
|
195
|
-
.limit(1)
|
|
196
|
-
|
|
201
|
+
.limit(1);
|
|
202
|
+
if (options?.forUpdate) query = query.forUpdate();
|
|
203
|
+
const rows = await query.execute();
|
|
197
204
|
return rows.map((row) => toFields(columns, row));
|
|
198
205
|
}
|
|
199
|
-
|
|
206
|
+
let query = database
|
|
200
207
|
.selectFrom(columns.table)
|
|
201
|
-
.selectAll()
|
|
202
|
-
|
|
203
|
-
|
|
208
|
+
.selectAll();
|
|
209
|
+
const rule = sourceSubjectRule(schema, request.model);
|
|
210
|
+
const subjects = sourceSubjectValues(rule, request.scope?.syncGroups);
|
|
211
|
+
if (subjects) {
|
|
212
|
+
if (subjects.length === 0) return [];
|
|
213
|
+
query = query.where(columnFor(columns, rule!.field), 'in', subjects);
|
|
214
|
+
}
|
|
215
|
+
const rows = await query.limit(request.query?.limit ?? 1000).execute();
|
|
204
216
|
return rows.map((row) => toFields(columns, row));
|
|
205
217
|
},
|
|
206
218
|
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* mapper is complete when it passes the same suite this one passes.
|
|
7
7
|
*
|
|
8
8
|
* It models the semantics minimally but faithfully: one row store per model, an
|
|
9
|
-
* idempotency ledger keyed by scoped correlation, and an
|
|
10
|
-
* monotonic cursor.
|
|
9
|
+
* idempotency ledger keyed by scoped correlation, and an acknowledgement-pruned
|
|
10
|
+
* outbox with a monotonic cursor.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { AbloValidationError } from '../../errors.js';
|
|
@@ -16,14 +16,16 @@ import type {
|
|
|
16
16
|
AdapterReadRequest,
|
|
17
17
|
DataSourceAdapter,
|
|
18
18
|
Row,
|
|
19
|
-
} from '
|
|
20
|
-
import { defineDatabaseAdapter } from '
|
|
21
|
-
import { memoryAdapterProfile } from '
|
|
22
|
-
import type { ChangeSet,
|
|
19
|
+
} from './adapter.js';
|
|
20
|
+
import { defineDatabaseAdapter } from './adapterFactory.js';
|
|
21
|
+
import { memoryAdapterProfile } from './adapterProfile.js';
|
|
22
|
+
import type { ChangeSet, Operation } from './contract.js';
|
|
23
|
+
import type { Migration } from './migration.js';
|
|
24
|
+
import type { EventsPage, OutboxEvent } from '../outbox/index.js';
|
|
23
25
|
import {
|
|
24
26
|
assertSourceIdempotencyIntent,
|
|
25
27
|
sourceChangeIntentHash,
|
|
26
|
-
} from '
|
|
28
|
+
} from './idempotency.js';
|
|
27
29
|
|
|
28
30
|
function rowId(op: Operation): string {
|
|
29
31
|
const id = op.id ?? (op.input?.id as string | undefined);
|
|
@@ -41,8 +43,9 @@ export function memoryDataSource(): DataSourceAdapter {
|
|
|
41
43
|
string,
|
|
42
44
|
{ readonly requestHash: string; readonly rows: Row[] }
|
|
43
45
|
>();
|
|
44
|
-
/**
|
|
46
|
+
/** Acknowledgement-pruned outbox with a monotonic cursor. */
|
|
45
47
|
const outbox: OutboxEvent[] = [];
|
|
48
|
+
let nextOutboxCursor = 1;
|
|
46
49
|
|
|
47
50
|
const modelStore = (model: string): Map<string, Row> => {
|
|
48
51
|
let m = store.get(model);
|
|
@@ -136,20 +139,34 @@ export function memoryDataSource(): DataSourceAdapter {
|
|
|
136
139
|
rows.push(row);
|
|
137
140
|
// Transactional outbox: one event per op, monotonic cursor.
|
|
138
141
|
outbox.push({
|
|
142
|
+
version: 2,
|
|
139
143
|
id: `${change.correlationId}:${index}`,
|
|
140
144
|
model: op.model,
|
|
141
145
|
entityId: String(row.id ?? rowId(op)),
|
|
142
146
|
type: op.type,
|
|
143
147
|
data: op.type === 'DELETE' ? null : row,
|
|
148
|
+
syncGroups: [],
|
|
144
149
|
correlationId: change.correlationId,
|
|
145
150
|
...(op.transactionId ? { transactionId: op.transactionId } : {}),
|
|
146
|
-
cursor: String(
|
|
151
|
+
cursor: String(nextOutboxCursor++),
|
|
147
152
|
});
|
|
148
153
|
}
|
|
149
154
|
idempotency.set(change.correlationId, { requestHash, rows });
|
|
150
155
|
return { rows };
|
|
151
156
|
},
|
|
152
157
|
|
|
158
|
+
async acknowledgeEvents(acknowledgedThrough: string): Promise<void> {
|
|
159
|
+
const after = Number(acknowledgedThrough);
|
|
160
|
+
let acknowledgedCount = 0;
|
|
161
|
+
while (
|
|
162
|
+
acknowledgedCount < outbox.length &&
|
|
163
|
+
Number(outbox[acknowledgedCount]?.cursor) <= after
|
|
164
|
+
) {
|
|
165
|
+
acknowledgedCount += 1;
|
|
166
|
+
}
|
|
167
|
+
if (acknowledgedCount > 0) outbox.splice(0, acknowledgedCount);
|
|
168
|
+
},
|
|
169
|
+
|
|
153
170
|
async events(cursor: string | null, limit: number): Promise<EventsPage> {
|
|
154
171
|
const after = cursor ? Number(cursor) : 0;
|
|
155
172
|
const page = outbox.filter((e) => Number(e.cursor) > after).slice(0, limit);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/** One forward-only infrastructure migration shipped by an adapter. */
|
|
4
|
+
export const migrationSchema = z.object({
|
|
5
|
+
/** Stable name, used as the migration filename + applied-ledger key. */
|
|
6
|
+
name: z.string().min(1),
|
|
7
|
+
/** The forward SQL. */
|
|
8
|
+
up: z.string().min(1),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export type Migration = z.infer<typeof migrationSchema>;
|
|
@@ -10,7 +10,10 @@
|
|
|
10
10
|
* it records changes in its own `sync_deltas` log instead.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import type { Migration } from './
|
|
13
|
+
import type { Migration } from './migration.js';
|
|
14
|
+
import { endpointOutboxMigrations } from '../outbox/index.js';
|
|
15
|
+
|
|
16
|
+
export { endpointOutboxMigrations } from '../outbox/index.js';
|
|
14
17
|
|
|
15
18
|
/**
|
|
16
19
|
* Add a column to `ablo_idempotency` only when it is genuinely missing.
|
|
@@ -87,37 +90,7 @@ export function idempotencyLedgerMigrations(schema = 'public'): readonly Migrati
|
|
|
87
90
|
];
|
|
88
91
|
}
|
|
89
92
|
|
|
90
|
-
/** Endpoint-only transactional outbox and its correlation columns. */
|
|
91
|
-
export function endpointOutboxMigrations(): readonly Migration[] {
|
|
92
|
-
return [
|
|
93
|
-
{
|
|
94
|
-
name: 'ablo_outbox',
|
|
95
|
-
up: `CREATE TABLE IF NOT EXISTS ablo_outbox (
|
|
96
|
-
cursor BIGSERIAL PRIMARY KEY,
|
|
97
|
-
id TEXT NOT NULL UNIQUE,
|
|
98
|
-
model TEXT NOT NULL,
|
|
99
|
-
entity_id TEXT NOT NULL,
|
|
100
|
-
type TEXT NOT NULL,
|
|
101
|
-
data JSONB,
|
|
102
|
-
organization_id TEXT,
|
|
103
|
-
client_tx_id TEXT,
|
|
104
|
-
correlation_id TEXT,
|
|
105
|
-
transaction_id TEXT,
|
|
106
|
-
occurred_at BIGINT,
|
|
107
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
108
|
-
);`,
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
name: 'ablo_outbox_correlation',
|
|
112
|
-
up: `ALTER TABLE ablo_outbox
|
|
113
|
-
ADD COLUMN IF NOT EXISTS correlation_id TEXT;
|
|
114
|
-
ALTER TABLE ablo_outbox
|
|
115
|
-
ADD COLUMN IF NOT EXISTS transaction_id TEXT;`,
|
|
116
|
-
},
|
|
117
|
-
];
|
|
118
|
-
}
|
|
119
|
-
|
|
120
93
|
/** Full endpoint adapter migrations (ledger + outbox). */
|
|
121
|
-
export function adapterTableMigrations(): readonly Migration[] {
|
|
122
|
-
return [...idempotencyLedgerMigrations(), ...endpointOutboxMigrations()];
|
|
94
|
+
export function adapterTableMigrations(schema = 'public'): readonly Migration[] {
|
|
95
|
+
return [...idempotencyLedgerMigrations(schema), ...endpointOutboxMigrations(schema)];
|
|
123
96
|
}
|
|
@@ -20,24 +20,40 @@ import type {
|
|
|
20
20
|
AdapterReadRequest,
|
|
21
21
|
DataSourceAdapter,
|
|
22
22
|
Row,
|
|
23
|
-
} from '
|
|
24
|
-
import { defineDatabaseAdapter } from '
|
|
25
|
-
import { postgresAdapterProfile } from '
|
|
26
|
-
import type { ChangeSet,
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
23
|
+
} from './adapter.js';
|
|
24
|
+
import { defineDatabaseAdapter } from './adapterFactory.js';
|
|
25
|
+
import { postgresAdapterProfile } from './adapterProfile.js';
|
|
26
|
+
import type { ChangeSet, Operation } from './contract.js';
|
|
27
|
+
import type { Migration } from './migration.js';
|
|
28
|
+
import type { EventsPage, OutboxEvent } from '../outbox/index.js';
|
|
29
|
+
import { adapterTableMigrations } from './migrations.js';
|
|
29
30
|
import {
|
|
30
31
|
assertSourceIdempotencyIntent,
|
|
31
32
|
assertSourceIdempotencyRetention,
|
|
32
33
|
SOURCE_IDEMPOTENCY_RETENTION,
|
|
33
34
|
sourceChangeIntentHash,
|
|
34
|
-
} from '
|
|
35
|
+
} from './idempotency.js';
|
|
35
36
|
import type { SchemaRecord, Schema } from '../../schema/schema.js';
|
|
37
|
+
import { toSchemaJSON } from '../../schema/serialize.js';
|
|
38
|
+
import { camelToSnake } from '../../schema/ddl.js';
|
|
36
39
|
import {
|
|
37
40
|
ABLO_POSTGRES_COMMIT_ECHO_PREFIX,
|
|
38
41
|
type SourceListQuery,
|
|
39
42
|
type SourceWhere,
|
|
40
43
|
} from '../types.js';
|
|
44
|
+
import {
|
|
45
|
+
authorizeSourceChange,
|
|
46
|
+
authorizeSourceRead,
|
|
47
|
+
lockSourceSubjectCreates,
|
|
48
|
+
rethrowStrictCreateConflict,
|
|
49
|
+
sourceSyncGroups,
|
|
50
|
+
sourceSubjectRule,
|
|
51
|
+
sourceSubjectValues,
|
|
52
|
+
} from './subjectAuthorization.js';
|
|
53
|
+
import {
|
|
54
|
+
decodeDatabaseOutboxEvent,
|
|
55
|
+
ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE,
|
|
56
|
+
} from '../outbox/index.js';
|
|
41
57
|
|
|
42
58
|
/** A Prisma model delegate — the subset of its methods the adapter calls. */
|
|
43
59
|
export interface PrismaDelegate {
|
|
@@ -146,7 +162,19 @@ export function prismaDataSource<S extends SchemaRecord>(
|
|
|
146
162
|
options: PrismaDataSourceOptions = {},
|
|
147
163
|
): DataSourceAdapter {
|
|
148
164
|
const delegateName = options.delegateName ?? lowerFirst;
|
|
149
|
-
|
|
165
|
+
const lockTargets = new Map<string, { table: string; subjectColumn: string }>();
|
|
166
|
+
for (const [key, definition] of Object.entries(toSchemaJSON(schema).models)) {
|
|
167
|
+
if (!definition.subject) continue;
|
|
168
|
+
const target = {
|
|
169
|
+
table: definition.tableName ?? key,
|
|
170
|
+
subjectColumn:
|
|
171
|
+
definition.fields[definition.subject.field]?.column ??
|
|
172
|
+
camelToSnake(definition.subject.field),
|
|
173
|
+
};
|
|
174
|
+
lockTargets.set(key.toLowerCase(), target);
|
|
175
|
+
if (definition.typename) lockTargets.set(definition.typename.toLowerCase(), target);
|
|
176
|
+
}
|
|
177
|
+
const quoted = (identifier: string): string => `"${identifier.replaceAll('"', '""')}"`;
|
|
150
178
|
|
|
151
179
|
const applyOperation = async (tx: PrismaRaw, op: Operation): Promise<Row> => {
|
|
152
180
|
if (op.where) {
|
|
@@ -188,9 +216,18 @@ export function prismaDataSource<S extends SchemaRecord>(
|
|
|
188
216
|
const delegate = delegateFor(prisma, delegateName(req.model));
|
|
189
217
|
if (req.kind === 'load') {
|
|
190
218
|
const row = await delegate.findUnique({ where: { id: req.id } });
|
|
191
|
-
return row ? [row] : [];
|
|
219
|
+
return authorizeSourceRead(schema, req, row ? [row] : []);
|
|
220
|
+
}
|
|
221
|
+
const args = findManyArgs(req.query);
|
|
222
|
+
const rule = sourceSubjectRule(schema, req.model);
|
|
223
|
+
const subjects = sourceSubjectValues(rule, req.scope?.syncGroups);
|
|
224
|
+
if (subjects?.length === 0) return [];
|
|
225
|
+
if (subjects) {
|
|
226
|
+
args.where = {
|
|
227
|
+
AND: [args.where ?? {}, { [rule!.field]: { in: subjects } }],
|
|
228
|
+
};
|
|
192
229
|
}
|
|
193
|
-
return delegate.findMany(
|
|
230
|
+
return authorizeSourceRead(schema, req, await delegate.findMany(args));
|
|
194
231
|
},
|
|
195
232
|
|
|
196
233
|
async commit(change: ChangeSet): Promise<AdapterCommitResult> {
|
|
@@ -211,22 +248,52 @@ export function prismaDataSource<S extends SchemaRecord>(
|
|
|
211
248
|
return { rows: cachedRow.response };
|
|
212
249
|
}
|
|
213
250
|
|
|
251
|
+
await lockSourceSubjectCreates(schema, change, async (_operation, key) => {
|
|
252
|
+
await tx.$queryRawUnsafe(
|
|
253
|
+
`SELECT pg_advisory_xact_lock(hashtextextended($1, 0))`,
|
|
254
|
+
key,
|
|
255
|
+
);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
await authorizeSourceChange(schema, change, async (operation) => {
|
|
259
|
+
if (!operation.id) return null;
|
|
260
|
+
const rule = sourceSubjectRule(schema, operation.model);
|
|
261
|
+
const target = lockTargets.get(operation.model.toLowerCase());
|
|
262
|
+
if (!rule || !target) return null;
|
|
263
|
+
const rows = await tx.$queryRawUnsafe<Row[]>(
|
|
264
|
+
`SELECT id, ${quoted(target.subjectColumn)} AS ${quoted(rule.field)}
|
|
265
|
+
FROM ${quoted(target.table)}
|
|
266
|
+
WHERE id = $1
|
|
267
|
+
LIMIT 1
|
|
268
|
+
FOR UPDATE`,
|
|
269
|
+
operation.id,
|
|
270
|
+
);
|
|
271
|
+
return rows[0] ?? null;
|
|
272
|
+
});
|
|
273
|
+
|
|
214
274
|
const rows: Row[] = [];
|
|
215
275
|
for (const [index, op] of change.operations.entries()) {
|
|
216
|
-
|
|
276
|
+
let row: Row;
|
|
277
|
+
try {
|
|
278
|
+
row = await applyOperation(tx, op);
|
|
279
|
+
} catch (error) {
|
|
280
|
+
if (op.type === 'CREATE') rethrowStrictCreateConflict(error, op);
|
|
281
|
+
throw error;
|
|
282
|
+
}
|
|
217
283
|
rows.push(row);
|
|
218
284
|
const entityId = String(row.id ?? rowId(op));
|
|
219
285
|
// Transactional outbox: one event per operation, written in this same transaction.
|
|
220
286
|
await tx.$executeRawUnsafe(
|
|
221
287
|
`INSERT INTO ablo_outbox (
|
|
222
|
-
id, model, entity_id, type, data,
|
|
288
|
+
id, model, entity_id, type, data, event_version, sync_groups,
|
|
223
289
|
correlation_id, transaction_id, occurred_at
|
|
224
|
-
) VALUES ($1, $2, $3, $4, $5::jsonb, $6, $7, $8)`,
|
|
290
|
+
) VALUES ($1, $2, $3, $4, $5::jsonb, 2, $6::text[], $7, $8, $9)`,
|
|
225
291
|
`${change.correlationId}:${index}`,
|
|
226
292
|
op.model,
|
|
227
293
|
entityId,
|
|
228
294
|
op.type,
|
|
229
295
|
JSON.stringify(op.type === 'DELETE' ? null : row),
|
|
296
|
+
sourceSyncGroups(schema, op.model, row),
|
|
230
297
|
change.correlationId,
|
|
231
298
|
op.transactionId ?? null,
|
|
232
299
|
Date.now(),
|
|
@@ -257,34 +324,31 @@ export function prismaDataSource<S extends SchemaRecord>(
|
|
|
257
324
|
});
|
|
258
325
|
},
|
|
259
326
|
|
|
327
|
+
async acknowledgeEvents(acknowledgedThrough: string): Promise<void> {
|
|
328
|
+
await prisma.$transaction(async (tx) => {
|
|
329
|
+
await tx.$executeRawUnsafe(
|
|
330
|
+
`DELETE FROM ablo_outbox
|
|
331
|
+
WHERE cursor IN (
|
|
332
|
+
SELECT cursor FROM ablo_outbox
|
|
333
|
+
WHERE cursor <= $1 ORDER BY cursor ASC LIMIT $2
|
|
334
|
+
)`,
|
|
335
|
+
acknowledgedThrough,
|
|
336
|
+
ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE,
|
|
337
|
+
);
|
|
338
|
+
});
|
|
339
|
+
},
|
|
340
|
+
|
|
260
341
|
async events(cursor: string | null, limit: number): Promise<EventsPage> {
|
|
261
|
-
const after = cursor
|
|
342
|
+
const after = cursor ?? '0';
|
|
262
343
|
const rows = await prisma.$queryRawUnsafe<Record<string, unknown>[]>(
|
|
263
|
-
`SELECT cursor, id, model, entity_id, type, data, organization_id,
|
|
344
|
+
`SELECT cursor, id, model, entity_id, type, data, event_version, sync_groups, organization_id,
|
|
264
345
|
client_tx_id, correlation_id, transaction_id, occurred_at
|
|
265
346
|
FROM ablo_outbox WHERE cursor > $1 ORDER BY cursor ASC LIMIT $2`,
|
|
266
347
|
after,
|
|
267
348
|
limit,
|
|
268
349
|
);
|
|
269
|
-
const events: OutboxEvent[] = rows.map(
|
|
270
|
-
|
|
271
|
-
id: r.id,
|
|
272
|
-
model: r.model,
|
|
273
|
-
entityId: r.entity_id,
|
|
274
|
-
type: r.type,
|
|
275
|
-
data: r.data ?? null,
|
|
276
|
-
organizationId: r.organization_id ?? null,
|
|
277
|
-
clientTxId: r.client_tx_id ?? null,
|
|
278
|
-
correlationId: r.correlation_id ?? null,
|
|
279
|
-
transactionId: r.transaction_id ?? null,
|
|
280
|
-
occurredAt: r.occurred_at != null ? Number(r.occurred_at) : null,
|
|
281
|
-
cursor: String(r.cursor),
|
|
282
|
-
}),
|
|
283
|
-
);
|
|
284
|
-
return {
|
|
285
|
-
events,
|
|
286
|
-
nextCursor: events.at(-1)?.cursor ?? null,
|
|
287
|
-
};
|
|
350
|
+
const events: OutboxEvent[] = rows.map(decodeDatabaseOutboxEvent);
|
|
351
|
+
return { events, nextCursor: events.at(-1)?.cursor ?? null };
|
|
288
352
|
},
|
|
289
353
|
});
|
|
290
354
|
}
|