@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
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Row/subject authorization for one model.
|
|
5
|
+
*
|
|
6
|
+
* A row is authorized exactly when the authenticated request carries the sync
|
|
7
|
+
* group `${group}:${row[field]}`. Both values are plain schema data so the rule
|
|
8
|
+
* survives serialization and can be compiled by every storage plane.
|
|
9
|
+
*/
|
|
10
|
+
export const subjectRuleSchema = z.strictObject({
|
|
11
|
+
field: z.string().regex(
|
|
12
|
+
/^[a-zA-Z_][a-zA-Z0-9_]*$/,
|
|
13
|
+
'subject.field must name a model field',
|
|
14
|
+
),
|
|
15
|
+
group: z.string().regex(
|
|
16
|
+
/^[a-z][a-z0-9_]*$/,
|
|
17
|
+
'subject.group must be a lowercase identifier, e.g. "workspace"',
|
|
18
|
+
),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export type SubjectRule = z.infer<typeof subjectRuleSchema>;
|
|
22
|
+
|
|
23
|
+
/** The exact trusted group a row must match, or null for a malformed row. */
|
|
24
|
+
export function subjectGroupForRow(
|
|
25
|
+
rule: SubjectRule,
|
|
26
|
+
row: Readonly<Record<string, unknown>>,
|
|
27
|
+
): string | null {
|
|
28
|
+
const value = row[rule.field];
|
|
29
|
+
return typeof value === 'string' && value.length > 0
|
|
30
|
+
? `${rule.group}:${value}`
|
|
31
|
+
: null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Fail-closed row check shared by endpoint adapters and in-memory log folds. */
|
|
35
|
+
export function subjectAuthorized(
|
|
36
|
+
rule: SubjectRule | undefined,
|
|
37
|
+
row: Readonly<Record<string, unknown>>,
|
|
38
|
+
groups: readonly string[] | null | undefined,
|
|
39
|
+
): boolean {
|
|
40
|
+
if (!rule) return true;
|
|
41
|
+
const required = subjectGroupForRow(rule, row);
|
|
42
|
+
return required !== null && (groups ?? []).includes(required);
|
|
43
|
+
}
|
package/src/server/adapter.ts
CHANGED
|
@@ -21,10 +21,11 @@ import type {
|
|
|
21
21
|
SourceOperation,
|
|
22
22
|
SourceRequestContext,
|
|
23
23
|
} from '../source/index.js';
|
|
24
|
-
import type { ServerSyncDelta } from '../
|
|
24
|
+
import type { ServerSyncDelta } from '../observation/contract.js';
|
|
25
25
|
import type { BootstrapModel } from './readConfig.js';
|
|
26
26
|
import type { CommitContext, CommitExecutionResult } from './commit.js';
|
|
27
27
|
import type { StorageMode } from './storageMode.js';
|
|
28
|
+
import type { SubjectRule } from '../schema/subject.js';
|
|
28
29
|
|
|
29
30
|
/**
|
|
30
31
|
* A canonical database row: one record, keyed by column name. The value type is
|
|
@@ -141,6 +142,7 @@ export type ReadRequest =
|
|
|
141
142
|
readonly sourceModel?: string;
|
|
142
143
|
/** `__typename` stamped on each returned row. */
|
|
143
144
|
readonly typename: string;
|
|
145
|
+
readonly subject?: SubjectRule;
|
|
144
146
|
readonly query: SourceListQuery;
|
|
145
147
|
readonly scope?: SourceRequestContext;
|
|
146
148
|
/** Runs the query against a hosted database: compile, take the tenant pool, apply row-level security, unpack the rows. */
|
package/src/server/commit.ts
CHANGED
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
* commit time and the shape of a stored or broadcast delta share one definition
|
|
14
14
|
* rather than being kept in step by hand.
|
|
15
15
|
*/
|
|
16
|
-
import type { ParticipantKind, ConfirmationState } from '../
|
|
17
|
-
import type { ParticipantRef } from '../
|
|
18
|
-
import type { CommitExecutionResultInput } from '../
|
|
19
|
-
import type { CommitOperationResult } from '../
|
|
20
|
-
import type { ReadDependency
|
|
16
|
+
import type { ParticipantKind, ConfirmationState } from '../observation/persistence/syncDeltaRow.js';
|
|
17
|
+
import type { ParticipantRef } from '../observation/contract.js';
|
|
18
|
+
import type { CommitExecutionResultInput } from '../commit/contract.js';
|
|
19
|
+
import type { CommitOperationResult } from '../commit/contract.js';
|
|
20
|
+
import type { ReadDependency } from '../coordination/schema.js';
|
|
21
21
|
import type { EffectiveAuthority } from '../auth/capability.js';
|
|
22
22
|
|
|
23
23
|
export interface CommitContext {
|
|
@@ -81,18 +81,10 @@ export interface CommitContext {
|
|
|
81
81
|
/**
|
|
82
82
|
* The premise for the whole batch. The committer declares the rows or groups
|
|
83
83
|
* it read to form this batch; the engine checks that none of them changed since
|
|
84
|
-
* each entry's `readAt` timestamp and
|
|
85
|
-
* across the batch. This differs from the per-operation `readAt` guard, which
|
|
84
|
+
* each entry's `readAt` timestamp and rejects the batch if one moved. This differs from the per-operation `readAt` guard, which
|
|
86
85
|
* validates only the rows being written. Omit it to check the write targets alone.
|
|
87
86
|
*/
|
|
88
87
|
reads?: ReadDependency[] | null;
|
|
89
|
-
/**
|
|
90
|
-
* Durable premises to persist for this commit's participant. Each entry is
|
|
91
|
-
* kept in `track_dependencies` and re-checked against every future delta; a
|
|
92
|
-
* later match opens a `StaleNotification` delivered out of band. Distinct
|
|
93
|
-
* from `reads`, which is checked once here and discarded.
|
|
94
|
-
*/
|
|
95
|
-
track?: TrackDependency[] | null;
|
|
96
88
|
}
|
|
97
89
|
|
|
98
90
|
/**
|
package/src/server/index.ts
CHANGED
|
@@ -26,7 +26,7 @@ export {
|
|
|
26
26
|
commitExecutionResultSchema,
|
|
27
27
|
commitRecordSchema,
|
|
28
28
|
type CommitRecord,
|
|
29
|
-
} from '../
|
|
29
|
+
} from '../commit/contract.js';
|
|
30
30
|
export { storageModeSchema, type StorageMode } from './storageMode.js';
|
|
31
31
|
export type {
|
|
32
32
|
ColumnOverride,
|
package/src/server/readConfig.ts
CHANGED
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
* Plain data, no database driver — it feeds the read side of the data adapter
|
|
20
20
|
* contract, and your query builder reads it to load a model's initial rows.
|
|
21
21
|
*/
|
|
22
|
+
import type { SubjectRule } from '../schema/subject.js';
|
|
23
|
+
|
|
22
24
|
|
|
23
25
|
/** A mapping from a declared field to a physical column, with the alias to apply after a `SELECT *`. */
|
|
24
26
|
export interface ColumnOverride {
|
|
@@ -88,6 +90,8 @@ export interface ReadModelShape {
|
|
|
88
90
|
readonly orgColumn?: string;
|
|
89
91
|
/** Parent-table scoping for rows with no tenancy column of their own. */
|
|
90
92
|
readonly scopedVia?: ParentScope;
|
|
93
|
+
/** Credential-bound row authorization compiled by every read plane. */
|
|
94
|
+
readonly subject?: SubjectRule;
|
|
91
95
|
/** Client-facing field name → physical DB column for declared fields. */
|
|
92
96
|
readonly fieldColumns?: Readonly<Record<string, string>>;
|
|
93
97
|
/** Physical-column aliases needed after SELECT * for `.from(...)` fields. */
|
|
@@ -24,13 +24,13 @@
|
|
|
24
24
|
* you want to override one of those while the adapter serves the rest.
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
import type { SourceListQuery, SourceRequestContext } from '
|
|
27
|
+
import type { SourceListQuery, SourceRequestContext } from '../types.js';
|
|
28
28
|
import type {
|
|
29
29
|
AdapterCapabilities,
|
|
30
30
|
ChangeSet,
|
|
31
|
-
EventsPage,
|
|
32
|
-
Migration,
|
|
33
31
|
} from './contract.js';
|
|
32
|
+
import type { Migration } from './migration.js';
|
|
33
|
+
import type { EventsPage } from '../outbox/index.js';
|
|
34
34
|
import type { DatabaseAdapterProfile } from './adapterProfile.js';
|
|
35
35
|
|
|
36
36
|
/**
|
|
@@ -83,8 +83,12 @@ export interface MutationAdapter {
|
|
|
83
83
|
*/
|
|
84
84
|
export interface DataSourceAdapter extends MutationAdapter {
|
|
85
85
|
readonly capabilities: AdapterCapabilities & { readonly outboxEvents: true };
|
|
86
|
-
/**
|
|
86
|
+
/** Pure read of events after `cursor`; `null` starts at the beginning. */
|
|
87
87
|
events(cursor: string | null, limit: number): Promise<EventsPage>;
|
|
88
|
+
/** Bounded cleanup through a consumer position Ablo has durably committed. */
|
|
89
|
+
acknowledgeEvents(acknowledgedThrough: string): Promise<void>;
|
|
88
90
|
}
|
|
89
91
|
|
|
90
|
-
export type { AdapterCapabilities, ChangeSet
|
|
92
|
+
export type { AdapterCapabilities, ChangeSet } from './contract.js';
|
|
93
|
+
export type { Migration } from './migration.js';
|
|
94
|
+
export type { EventsPage, OutboxEvent } from '../outbox/index.js';
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* binding, observation, and advertised guarantees.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { AbloValidationError } from '
|
|
9
|
+
import { AbloValidationError } from '../../errors.js';
|
|
10
10
|
import type { MutationAdapter } from './adapter.js';
|
|
11
11
|
import { databaseAdapterProfileSchema } from './adapterProfile.js';
|
|
12
12
|
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* failing deep inside a transaction, and each TypeScript type is inferred from the
|
|
6
6
|
* one schema that validates it.
|
|
7
7
|
*
|
|
8
|
-
* These schemas describe the adapter's
|
|
9
|
-
*
|
|
8
|
+
* These schemas describe the adapter's mutation contract: the change set it
|
|
9
|
+
* commits and the capabilities it advertises. The operation
|
|
10
10
|
* vocabulary is not restated here — `operationSchema` is projected from the
|
|
11
11
|
* core's `commitOperationSchema`, so an action or field added to the commit
|
|
12
12
|
* contract reaches a data source by construction. The assertion at the end of
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import { z } from 'zod';
|
|
19
|
-
import { correlationIdSchema } from '
|
|
19
|
+
import { correlationIdSchema } from '../../commit/contract.js';
|
|
20
20
|
import {
|
|
21
21
|
commitOperationSchema,
|
|
22
22
|
commitOperationTypeSchema,
|
|
23
|
-
} from '
|
|
23
|
+
} from '../../coordination/schema.js';
|
|
24
24
|
import {
|
|
25
25
|
ABLO_SOURCE_CLIENT_TX_ID_MAX_LENGTH,
|
|
26
26
|
ABLO_SOURCE_ECHO_MAX_OPERATIONS,
|
|
@@ -28,7 +28,8 @@ import {
|
|
|
28
28
|
type SourceCommitEcho,
|
|
29
29
|
type SourceCommitEchoMarker,
|
|
30
30
|
type SourceOperation,
|
|
31
|
-
} from '
|
|
31
|
+
} from '../types.js';
|
|
32
|
+
import type { SourceRequestContext } from '../types.js';
|
|
32
33
|
|
|
33
34
|
const jsonObject = z.record(z.string(), z.unknown());
|
|
34
35
|
|
|
@@ -44,15 +45,15 @@ export type OperationType = z.infer<typeof operationTypeSchema>;
|
|
|
44
45
|
* A single operation within a change set, and the runtime validator for it.
|
|
45
46
|
*
|
|
46
47
|
* The field set is projected from `commitOperationSchema` — an operation
|
|
47
|
-
* reaching a data source is a commit operation minus the
|
|
48
|
-
* settles internally
|
|
48
|
+
* reaching a data source is a commit operation minus the fencing field the
|
|
49
|
+
* core settles internally. The two `min(1)` overrides are
|
|
49
50
|
* deliberate and local: this is a customer-implemented boundary, so an empty
|
|
50
51
|
* model name or row id is rejected here rather than forwarded. Stating them as
|
|
51
52
|
* an extension keeps the tightening visible as a choice instead of hiding it
|
|
52
53
|
* inside a second copy of the shape.
|
|
53
54
|
*/
|
|
54
55
|
export const operationSchema = commitOperationSchema
|
|
55
|
-
.omit({
|
|
56
|
+
.omit({ fenceToken: true })
|
|
56
57
|
.extend({
|
|
57
58
|
model: z.string().min(1),
|
|
58
59
|
id: z.string().min(1).nullish(),
|
|
@@ -149,62 +150,17 @@ export const changeSetSchema = z.object({
|
|
|
149
150
|
correlationId: correlationIdSchema,
|
|
150
151
|
intentHash: z.string().regex(/^[a-f0-9]{64}$/).optional(),
|
|
151
152
|
echo: sourceCommitEchoSchema.optional(),
|
|
153
|
+
scope: z.object({
|
|
154
|
+
participantId: z.string().optional(),
|
|
155
|
+
participantKind: z.enum(['user', 'agent', 'system']).optional(),
|
|
156
|
+
organizationId: z.string().optional(),
|
|
157
|
+
branchId: z.string().optional(),
|
|
158
|
+
projectId: z.string().optional(),
|
|
159
|
+
syncGroups: z.array(z.string()).optional(),
|
|
160
|
+
}).optional() satisfies z.ZodType<SourceRequestContext | undefined>,
|
|
152
161
|
});
|
|
153
162
|
export type ChangeSet = z.infer<typeof changeSetSchema>;
|
|
154
163
|
|
|
155
|
-
/**
|
|
156
|
-
* A row in the adapter's `ablo_outbox` table. The adapter writes it in the same
|
|
157
|
-
* transaction as the underlying row change — the transactional-outbox pattern — so
|
|
158
|
-
* a change and its event commit together or not at all. The `events()` feed later
|
|
159
|
-
* reads these rows back and hands them to Ablo, and `cursor` is the monotonic
|
|
160
|
-
* ordering key Ablo round-trips to resume where it left off.
|
|
161
|
-
*/
|
|
162
|
-
export const outboxEventSchema = z.object({
|
|
163
|
-
/** Stable, globally-unique id — Ablo's replay-protection key. */
|
|
164
|
-
id: z.string().min(1),
|
|
165
|
-
model: z.string().min(1),
|
|
166
|
-
entityId: z.string().min(1),
|
|
167
|
-
type: operationTypeSchema,
|
|
168
|
-
/** The changed row, in the key shape `SourceEvent.data` defines: the model's
|
|
169
|
-
* declared schema fields, never the table's physical column names. */
|
|
170
|
-
data: jsonObject.nullish(),
|
|
171
|
-
organizationId: z.string().nullish(),
|
|
172
|
-
/** Legacy source transaction id. Never use this field to settle a queued commit. */
|
|
173
|
-
clientTxId: z.string().nullish(),
|
|
174
|
-
/** Scoped server-authored identity that correlates this event to a queued commit. */
|
|
175
|
-
correlationId: correlationIdSchema.nullish(),
|
|
176
|
-
/** Stable identity of this operation within the correlated source commit. */
|
|
177
|
-
transactionId: z
|
|
178
|
-
.string()
|
|
179
|
-
.min(1)
|
|
180
|
-
.max(ABLO_SOURCE_CLIENT_TX_ID_MAX_LENGTH)
|
|
181
|
-
.nullish(),
|
|
182
|
-
occurredAt: z.number().nullish(),
|
|
183
|
-
/** Monotonic ordering key (bigint as string). `events()` pages by `cursor > ?`. */
|
|
184
|
-
cursor: z.string().min(1),
|
|
185
|
-
});
|
|
186
|
-
export type OutboxEvent = z.infer<typeof outboxEventSchema>;
|
|
187
|
-
|
|
188
|
-
/** A page of outbox events returned by `events()`. */
|
|
189
|
-
export const eventsPageSchema = z.object({
|
|
190
|
-
events: z.array(outboxEventSchema),
|
|
191
|
-
nextCursor: z.string().nullable(),
|
|
192
|
-
});
|
|
193
|
-
export type EventsPage = z.infer<typeof eventsPageSchema>;
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* A table-creation migration an adapter ships, so you never hand-write the
|
|
197
|
-
* `ablo_idempotency` and `ablo_outbox` tables yourself. An adapter returns these
|
|
198
|
-
* from its `migrations()` method.
|
|
199
|
-
*/
|
|
200
|
-
export const migrationSchema = z.object({
|
|
201
|
-
/** Stable name, used as the migration filename + applied-ledger key. */
|
|
202
|
-
name: z.string().min(1),
|
|
203
|
-
/** The forward SQL. */
|
|
204
|
-
up: z.string().min(1),
|
|
205
|
-
});
|
|
206
|
-
export type Migration = z.infer<typeof migrationSchema>;
|
|
207
|
-
|
|
208
164
|
/** Describes what an adapter's backend supports, so callers check a capability rather than infer it from behavior. */
|
|
209
165
|
export const adapterCapabilitiesSchema = z.object({
|
|
210
166
|
/** `commit` is atomic across all operations in the change set. */
|
|
@@ -244,6 +200,13 @@ const _echoContractInSync: [_AssertEchoMatchesWire, _AssertWireMatchesEcho] = [
|
|
|
244
200
|
];
|
|
245
201
|
void _echoContractInSync;
|
|
246
202
|
|
|
203
|
+
// Compatibility façade. New implementation code follows the owned subsystem
|
|
204
|
+
// downward from `outbox/index.ts` and imports migrations from `migration.ts`.
|
|
205
|
+
export { eventsPageSchema, outboxEventSchema } from '../outbox/contract.js';
|
|
206
|
+
export type { EventsPage, OutboxEvent } from '../outbox/contract.js';
|
|
207
|
+
export { migrationSchema } from './migration.js';
|
|
208
|
+
export type { Migration } from './migration.js';
|
|
209
|
+
|
|
247
210
|
type _AssertEchoMarkerMatchesWire = SourceCommitEchoMarkerWire extends SourceCommitEchoMarker
|
|
248
211
|
? true
|
|
249
212
|
: never;
|
|
@@ -41,23 +41,37 @@ import type {
|
|
|
41
41
|
AdapterReadRequest,
|
|
42
42
|
DataSourceAdapter,
|
|
43
43
|
Row,
|
|
44
|
-
} from '
|
|
45
|
-
import { defineDatabaseAdapter } from '
|
|
46
|
-
import { postgresAdapterProfile } from '
|
|
47
|
-
import type { ChangeSet,
|
|
48
|
-
import {
|
|
49
|
-
import { adapterTableMigrations } from '
|
|
44
|
+
} from './adapter.js';
|
|
45
|
+
import { defineDatabaseAdapter } from './adapterFactory.js';
|
|
46
|
+
import { postgresAdapterProfile } from './adapterProfile.js';
|
|
47
|
+
import type { ChangeSet, Operation } from './contract.js';
|
|
48
|
+
import type { Migration } from './migration.js';
|
|
49
|
+
import { adapterTableMigrations } from './migrations.js';
|
|
50
50
|
import {
|
|
51
51
|
assertSourceIdempotencyIntent,
|
|
52
52
|
assertSourceIdempotencyRetention,
|
|
53
53
|
SOURCE_IDEMPOTENCY_RETENTION,
|
|
54
54
|
sourceChangeIntentHash,
|
|
55
|
-
} from '
|
|
55
|
+
} from './idempotency.js';
|
|
56
56
|
import type { Schema, SchemaRecord } from '../../schema/schema.js';
|
|
57
57
|
import { toSchemaJSON } from '../../schema/serialize.js';
|
|
58
58
|
import { camelToSnake, snakeToCamel } from '../../schema/ddl.js';
|
|
59
59
|
import { tenancyColumn } from '../../schema/tenancy.js';
|
|
60
60
|
import { ABLO_POSTGRES_COMMIT_ECHO_PREFIX } from '../types.js';
|
|
61
|
+
import {
|
|
62
|
+
authorizeSourceChange,
|
|
63
|
+
authorizeSourceRead,
|
|
64
|
+
lockSourceSubjectCreates,
|
|
65
|
+
rethrowStrictCreateConflict,
|
|
66
|
+
sourceSyncGroups,
|
|
67
|
+
sourceSubjectRule,
|
|
68
|
+
sourceSubjectValues,
|
|
69
|
+
} from './subjectAuthorization.js';
|
|
70
|
+
import {
|
|
71
|
+
decodeDatabaseOutboxEvent,
|
|
72
|
+
ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE,
|
|
73
|
+
type EventsPage,
|
|
74
|
+
} from '../outbox/index.js';
|
|
61
75
|
|
|
62
76
|
/** The subset of a Drizzle database/transaction handle the adapter calls. */
|
|
63
77
|
export interface DrizzleLike {
|
|
@@ -214,11 +228,18 @@ export function drizzleDataSource<S extends SchemaRecord>(
|
|
|
214
228
|
const table = sql.identifier(mc.table);
|
|
215
229
|
if (req.kind === 'load') {
|
|
216
230
|
const rows = rowsOf(await db.execute(sql`SELECT * FROM ${table} WHERE id = ${req.id} LIMIT 1`));
|
|
217
|
-
return rows.map((r) => toFields(mc, r));
|
|
231
|
+
return authorizeSourceRead(schema, req, rows.map((r) => toFields(mc, r)));
|
|
218
232
|
}
|
|
219
233
|
const limit = req.query?.limit ?? 1000;
|
|
220
|
-
const
|
|
221
|
-
|
|
234
|
+
const rule = sourceSubjectRule(schema, req.model);
|
|
235
|
+
const subjects = sourceSubjectValues(rule, req.scope?.syncGroups);
|
|
236
|
+
if (subjects?.length === 0) return [];
|
|
237
|
+
const rows = rowsOf(await db.execute(subjects
|
|
238
|
+
? sql`SELECT * FROM ${table}
|
|
239
|
+
WHERE ${sql.identifier(columnFor(mc, rule!.field))} = ANY(${subjects})
|
|
240
|
+
LIMIT ${limit}`
|
|
241
|
+
: sql`SELECT * FROM ${table} LIMIT ${limit}`));
|
|
242
|
+
return authorizeSourceRead(schema, req, rows.map((r) => toFields(mc, r)));
|
|
222
243
|
},
|
|
223
244
|
|
|
224
245
|
async commit(change: ChangeSet): Promise<AdapterCommitResult> {
|
|
@@ -238,19 +259,46 @@ export function drizzleDataSource<S extends SchemaRecord>(
|
|
|
238
259
|
return { rows: cachedRow.response as Row[] };
|
|
239
260
|
}
|
|
240
261
|
|
|
262
|
+
await lockSourceSubjectCreates(schema, change, async (_operation, key) => {
|
|
263
|
+
await tx.execute(sql`SELECT pg_advisory_xact_lock(hashtextextended(${key}, 0))`);
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
await authorizeSourceChange(schema, change, async (operation) => {
|
|
267
|
+
if (!operation.id) return null;
|
|
268
|
+
const mc = modelColumns(operation.model);
|
|
269
|
+
const found = rowsOf(
|
|
270
|
+
await tx.execute(
|
|
271
|
+
sql`SELECT * FROM ${sql.identifier(mc.table)} WHERE id = ${operation.id} LIMIT 1 FOR UPDATE`,
|
|
272
|
+
),
|
|
273
|
+
)[0];
|
|
274
|
+
return found ? toFields(mc, found) : null;
|
|
275
|
+
});
|
|
276
|
+
|
|
241
277
|
const rows: Row[] = [];
|
|
242
278
|
for (const [index, op] of change.operations.entries()) {
|
|
243
|
-
|
|
279
|
+
let row: Row;
|
|
280
|
+
try {
|
|
281
|
+
row = await applyOperation(tx, op);
|
|
282
|
+
} catch (error) {
|
|
283
|
+
if (op.type === 'CREATE') rethrowStrictCreateConflict(error, op);
|
|
284
|
+
throw error;
|
|
285
|
+
}
|
|
244
286
|
rows.push(row);
|
|
245
287
|
const entityId = String(row.id ?? rowId(op));
|
|
288
|
+
const syncGroups = sourceSyncGroups(schema, op.model, row);
|
|
289
|
+
const syncGroupsSql = sql`ARRAY[${sql.join(
|
|
290
|
+
syncGroups.map((group) => sql`${group}`),
|
|
291
|
+
sql`, `,
|
|
292
|
+
)}]::text[]`;
|
|
246
293
|
await tx.execute(sql`
|
|
247
294
|
INSERT INTO ablo_outbox (
|
|
248
|
-
id, model, entity_id, type, data,
|
|
295
|
+
id, model, entity_id, type, data, event_version, sync_groups,
|
|
249
296
|
correlation_id, transaction_id, occurred_at
|
|
250
297
|
)
|
|
251
298
|
VALUES (
|
|
252
299
|
${`${change.correlationId}:${index}`}, ${op.model}, ${entityId}, ${op.type},
|
|
253
|
-
${op.type === 'DELETE' ? null : JSON.stringify(row)}::jsonb,
|
|
300
|
+
${op.type === 'DELETE' ? null : JSON.stringify(row)}::jsonb, 2,
|
|
301
|
+
${syncGroupsSql},
|
|
254
302
|
${change.correlationId}, ${op.transactionId ?? null}, ${Date.now()}
|
|
255
303
|
)`);
|
|
256
304
|
}
|
|
@@ -270,29 +318,27 @@ export function drizzleDataSource<S extends SchemaRecord>(
|
|
|
270
318
|
});
|
|
271
319
|
},
|
|
272
320
|
|
|
321
|
+
async acknowledgeEvents(acknowledgedThrough: string): Promise<void> {
|
|
322
|
+
await db.transaction(async (tx) => {
|
|
323
|
+
await tx.execute(sql`
|
|
324
|
+
DELETE FROM ablo_outbox
|
|
325
|
+
WHERE cursor IN (
|
|
326
|
+
SELECT cursor FROM ablo_outbox
|
|
327
|
+
WHERE cursor <= ${acknowledgedThrough}
|
|
328
|
+
ORDER BY cursor ASC LIMIT ${ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE}
|
|
329
|
+
)`);
|
|
330
|
+
});
|
|
331
|
+
},
|
|
332
|
+
|
|
273
333
|
async events(cursor: string | null, limit: number): Promise<EventsPage> {
|
|
274
334
|
const after = cursor ?? '0';
|
|
275
335
|
const rows = rowsOf(
|
|
276
336
|
await db.execute(sql`
|
|
277
|
-
SELECT cursor, id, model, entity_id, type, data, organization_id,
|
|
337
|
+
SELECT cursor, id, model, entity_id, type, data, event_version, sync_groups, organization_id,
|
|
278
338
|
client_tx_id, correlation_id, transaction_id, occurred_at
|
|
279
339
|
FROM ablo_outbox WHERE cursor > ${after} ORDER BY cursor ASC LIMIT ${limit}`),
|
|
280
340
|
);
|
|
281
|
-
const events = rows.map(
|
|
282
|
-
outboxEventSchema.parse({
|
|
283
|
-
id: r.id,
|
|
284
|
-
model: r.model,
|
|
285
|
-
entityId: r.entity_id,
|
|
286
|
-
type: r.type,
|
|
287
|
-
data: r.data ?? null,
|
|
288
|
-
organizationId: r.organization_id ?? null,
|
|
289
|
-
clientTxId: r.client_tx_id ?? null,
|
|
290
|
-
correlationId: r.correlation_id ?? null,
|
|
291
|
-
transactionId: r.transaction_id ?? null,
|
|
292
|
-
occurredAt: r.occurred_at != null ? Number(r.occurred_at) : null,
|
|
293
|
-
cursor: String(r.cursor),
|
|
294
|
-
}),
|
|
295
|
-
);
|
|
341
|
+
const events = rows.map(decodeDatabaseOutboxEvent);
|
|
296
342
|
return { events, nextCursor: events.at(-1)?.cursor ?? null };
|
|
297
343
|
},
|
|
298
344
|
});
|
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
|
|
13
13
|
import { createHash } from 'node:crypto';
|
|
14
14
|
import { z } from 'zod';
|
|
15
|
-
import { AbloValidationError } from '
|
|
15
|
+
import { AbloValidationError } from '../../errors.js';
|
|
16
16
|
import {
|
|
17
17
|
COMMIT_CORRELATION_ID_MAX_LENGTH,
|
|
18
18
|
correlationIdSchema,
|
|
19
|
-
} from '
|
|
19
|
+
} from '../../commit/contract.js';
|
|
20
20
|
import type { ChangeSet, Operation } from './contract.js';
|
|
21
21
|
|
|
22
22
|
const SOURCE_ECHO_TRANSACTION_ID_PREFIX = 'ablo_echo_tx_v1:';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Customer-database adapter subsystem.
|
|
3
|
+
*
|
|
4
|
+
* Start here and descend through the behavioral adapter port, mutation
|
|
5
|
+
* contract, profiles, migrations, idempotency, authorization, conformance,
|
|
6
|
+
* and concrete ORM bindings.
|
|
7
|
+
*/
|
|
8
|
+
export * from './adapter.js';
|
|
9
|
+
export * from './adapterFactory.js';
|
|
10
|
+
export * from './adapterProfile.js';
|
|
11
|
+
export * from './contract.js';
|
|
12
|
+
export * from './migration.js';
|
|
13
|
+
export * from './migrations.js';
|
|
14
|
+
export * from './idempotency.js';
|
|
15
|
+
export * from './subjectAuthorization.js';
|
|
16
|
+
export * from './conformance.js';
|
|
17
|
+
export * from './memory.js';
|
|
18
|
+
export * from './prisma.js';
|
|
19
|
+
export * from './drizzle.js';
|
|
20
|
+
export * from './kysely.js';
|