@abloatai/transaction 0.57.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 +51 -41
- 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 +51 -57
- package/dist/client/resources/httpResources.d.ts.map +1 -0
- package/dist/{resources → client/resources}/httpResources.js +1 -1
- package/dist/client/resources/httpResources.js.map +1 -0
- package/dist/{resources → client/resources}/modelCreate.d.ts +1 -1
- package/dist/client/resources/modelCreate.d.ts.map +1 -0
- package/dist/{resources → client/resources}/modelCreate.js +1 -1
- package/dist/client/resources/modelCreate.js.map +1 -0
- package/dist/{resources → client/resources}/modelOperations.d.ts +35 -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 +2 -35
- package/dist/client/resources/writeOptionsSchema.d.ts.map +1 -0
- package/dist/{resources → client/resources}/writeOptionsSchema.js +5 -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} +13 -20
- 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/{transport/httpCommitRequest.d.ts → commit/httpRequest.d.ts} +6 -6
- package/dist/commit/httpRequest.d.ts.map +1 -0
- package/dist/{transport/httpCommitRequest.js → commit/httpRequest.js} +2 -3
- 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} +10 -25
- 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 -459
- package/dist/coordination/schema.d.ts.map +1 -1
- package/dist/coordination/schema.js +13 -261
- package/dist/coordination/schema.js.map +1 -1
- package/dist/errorCodes.d.ts +15 -9
- package/dist/errorCodes.d.ts.map +1 -1
- package/dist/errorCodes.js +13 -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/index.d.ts +5 -6
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +4 -7
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/model.d.ts +0 -27
- package/dist/schema/model.d.ts.map +1 -1
- package/dist/schema/model.js +0 -2
- package/dist/schema/model.js.map +1 -1
- package/dist/schema/openapi.d.ts.map +1 -1
- package/dist/schema/openapi.js +45 -6
- package/dist/schema/openapi.js.map +1 -1
- package/dist/schema/schema.d.ts +11 -3
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +9 -2
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/serialize.d.ts +1 -4
- package/dist/schema/serialize.d.ts.map +1 -1
- package/dist/schema/serialize.js +0 -4
- package/dist/schema/serialize.js.map +1 -1
- package/dist/schema/tenancy.d.ts +1 -1
- package/dist/server/adapter.d.ts +1 -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/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} +8 -77
- package/dist/source/adapters/contract.d.ts.map +1 -0
- package/dist/source/{contract.js → adapters/contract.js} +12 -57
- 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 +21 -23
- 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 +1 -1
- package/dist/source/adapters/kysely.d.ts.map +1 -1
- package/dist/source/adapters/kysely.js +18 -20
- package/dist/source/adapters/kysely.js.map +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +2 -2
- package/dist/source/adapters/kyselyMutationCore.d.ts.map +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +1 -1
- 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 +19 -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 -52
- 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 +21 -28
- package/dist/source/adapters/prisma.js.map +1 -1
- package/dist/source/{subjectAuthorization.d.ts → adapters/subjectAuthorization.d.ts} +1 -1
- package/dist/source/adapters/subjectAuthorization.d.ts.map +1 -0
- package/dist/source/{subjectAuthorization.js → adapters/subjectAuthorization.js} +2 -2
- 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} +3 -3
- package/dist/source/endpoint/factory.d.ts.map +1 -0
- package/dist/source/{factory.js → endpoint/factory.js} +9 -4
- 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 +14 -12
- package/dist/source/index.d.ts.map +1 -1
- package/dist/source/index.js +13 -11
- 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 +16 -17
- package/dist/source/types.d.ts.map +1 -1
- package/dist/source/types.js +1 -0
- package/dist/source/types.js.map +1 -1
- package/dist/syncLog/contract.d.ts +19 -2
- package/dist/syncLog/contract.d.ts.map +1 -1
- package/dist/syncLog/contract.js +19 -2
- package/dist/syncLog/contract.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} +26 -45
- package/dist/transport/http/client.d.ts.map +1 -0
- package/dist/transport/{httpClient.js → http/client.js} +84 -124
- package/dist/transport/http/client.js.map +1 -0
- package/dist/transport/{httpTransportHelpers.d.ts → http/helpers.d.ts} +5 -5
- package/dist/transport/http/helpers.d.ts.map +1 -0
- package/dist/transport/{httpTransportHelpers.js → http/helpers.js} +5 -5
- 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} +95 -93
- 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/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 +17 -15
- package/dist/wire/index.d.ts.map +1 -1
- package/dist/wire/index.js +11 -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/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 +48 -68
- package/src/{resources → client/resources}/modelCreate.ts +2 -2
- package/src/{resources → client/resources}/modelOperations.ts +46 -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 +7 -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} +11 -25
- package/src/{durableWrites.ts → commit/durableWrites.ts} +7 -7
- package/src/{transport/httpCommitRequest.ts → commit/httpRequest.ts} +6 -7
- package/src/commit/index.ts +16 -0
- package/src/{readSetContext.ts → commit/readSetContext.ts} +16 -41
- package/src/{commitRecordRuntime.ts → commit/recordRuntime.ts} +12 -67
- package/src/coordination/index.ts +4 -52
- package/src/coordination/schema.ts +15 -302
- package/src/errorCodes.ts +56 -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/index.ts +4 -20
- package/src/schema/model.ts +0 -33
- package/src/schema/openapi.ts +47 -7
- package/src/schema/schema.ts +23 -3
- package/src/schema/serialize.ts +0 -8
- package/src/server/adapter.ts +1 -1
- package/src/server/commit.ts +6 -14
- package/src/server/index.ts +1 -1
- 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} +16 -64
- package/src/source/adapters/drizzle.ts +29 -27
- package/src/source/{idempotency.ts → adapters/idempotency.ts} +2 -2
- package/src/source/adapters/index.ts +20 -0
- package/src/source/adapters/kysely.ts +32 -25
- package/src/source/adapters/kyselyMutationCore.ts +3 -3
- package/src/source/adapters/memory.ts +25 -9
- package/src/source/adapters/migration.ts +11 -0
- package/src/source/{migrations.ts → adapters/migrations.ts} +6 -54
- package/src/source/adapters/prisma.ts +33 -32
- package/src/source/{subjectAuthorization.ts → adapters/subjectAuthorization.ts} +2 -2
- 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} +13 -8
- 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 +22 -19
- 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 +17 -17
- package/src/syncLog/contract.ts +19 -2
- 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} +128 -209
- package/src/transport/{httpTransportHelpers.ts → http/helpers.ts} +7 -7
- 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} +127 -113
- 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/frames.ts +5 -15
- package/src/wire/inboundFrames.ts +3 -3
- package/src/wire/index.ts +19 -15
- package/src/wire/modelMutations.ts +1 -14
- 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.map +0 -1
- package/dist/resources/modelCreate.d.ts.map +0 -1
- package/dist/resources/modelCreate.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/source/subjectAuthorization.d.ts.map +0 -1
- package/dist/source/subjectAuthorization.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/httpCommitRequest.d.ts.map +0 -1
- package/dist/transport/httpCommitRequest.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/httpTransportHelpers.d.ts.map +0 -1
- package/dist/transport/httpTransportHelpers.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 -2866
- 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
|
@@ -20,18 +20,19 @@ 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';
|
|
36
37
|
import { toSchemaJSON } from '../../schema/serialize.js';
|
|
37
38
|
import { camelToSnake } from '../../schema/ddl.js';
|
|
@@ -48,7 +49,11 @@ import {
|
|
|
48
49
|
sourceSyncGroups,
|
|
49
50
|
sourceSubjectRule,
|
|
50
51
|
sourceSubjectValues,
|
|
51
|
-
} from '
|
|
52
|
+
} from './subjectAuthorization.js';
|
|
53
|
+
import {
|
|
54
|
+
decodeDatabaseOutboxEvent,
|
|
55
|
+
ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE,
|
|
56
|
+
} from '../outbox/index.js';
|
|
52
57
|
|
|
53
58
|
/** A Prisma model delegate — the subset of its methods the adapter calls. */
|
|
54
59
|
export interface PrismaDelegate {
|
|
@@ -280,9 +285,9 @@ export function prismaDataSource<S extends SchemaRecord>(
|
|
|
280
285
|
// Transactional outbox: one event per operation, written in this same transaction.
|
|
281
286
|
await tx.$executeRawUnsafe(
|
|
282
287
|
`INSERT INTO ablo_outbox (
|
|
283
|
-
id, model, entity_id, type, data, sync_groups,
|
|
288
|
+
id, model, entity_id, type, data, event_version, sync_groups,
|
|
284
289
|
correlation_id, transaction_id, occurred_at
|
|
285
|
-
) VALUES ($1, $2, $3, $4, $5::jsonb, $6::text[], $7, $8, $9)`,
|
|
290
|
+
) VALUES ($1, $2, $3, $4, $5::jsonb, 2, $6::text[], $7, $8, $9)`,
|
|
286
291
|
`${change.correlationId}:${index}`,
|
|
287
292
|
op.model,
|
|
288
293
|
entityId,
|
|
@@ -319,35 +324,31 @@ export function prismaDataSource<S extends SchemaRecord>(
|
|
|
319
324
|
});
|
|
320
325
|
},
|
|
321
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
|
+
|
|
322
341
|
async events(cursor: string | null, limit: number): Promise<EventsPage> {
|
|
323
|
-
const after = cursor
|
|
342
|
+
const after = cursor ?? '0';
|
|
324
343
|
const rows = await prisma.$queryRawUnsafe<Record<string, unknown>[]>(
|
|
325
|
-
`SELECT cursor, id, model, entity_id, type, data, sync_groups, organization_id,
|
|
344
|
+
`SELECT cursor, id, model, entity_id, type, data, event_version, sync_groups, organization_id,
|
|
326
345
|
client_tx_id, correlation_id, transaction_id, occurred_at
|
|
327
346
|
FROM ablo_outbox WHERE cursor > $1 ORDER BY cursor ASC LIMIT $2`,
|
|
328
347
|
after,
|
|
329
348
|
limit,
|
|
330
349
|
);
|
|
331
|
-
const events: OutboxEvent[] = rows.map(
|
|
332
|
-
|
|
333
|
-
id: r.id,
|
|
334
|
-
model: r.model,
|
|
335
|
-
entityId: r.entity_id,
|
|
336
|
-
type: r.type,
|
|
337
|
-
data: r.data ?? null,
|
|
338
|
-
syncGroups: r.sync_groups ?? [],
|
|
339
|
-
organizationId: r.organization_id ?? null,
|
|
340
|
-
clientTxId: r.client_tx_id ?? null,
|
|
341
|
-
correlationId: r.correlation_id ?? null,
|
|
342
|
-
transactionId: r.transaction_id ?? null,
|
|
343
|
-
occurredAt: r.occurred_at != null ? Number(r.occurred_at) : null,
|
|
344
|
-
cursor: String(r.cursor),
|
|
345
|
-
}),
|
|
346
|
-
);
|
|
347
|
-
return {
|
|
348
|
-
events,
|
|
349
|
-
nextCursor: events.at(-1)?.cursor ?? null,
|
|
350
|
-
};
|
|
350
|
+
const events: OutboxEvent[] = rows.map(decodeDatabaseOutboxEvent);
|
|
351
|
+
return { events, nextCursor: events.at(-1)?.cursor ?? null };
|
|
351
352
|
},
|
|
352
353
|
});
|
|
353
354
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AbloPermissionError, AbloValidationError } from '
|
|
1
|
+
import { AbloPermissionError, AbloValidationError } from '../../errors.js';
|
|
2
2
|
import {
|
|
3
3
|
composeEntitySyncGroups,
|
|
4
4
|
syncGroupsForRow,
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
type Schema,
|
|
9
9
|
type SchemaRecord,
|
|
10
10
|
type SubjectRule,
|
|
11
|
-
} from '
|
|
11
|
+
} from '../../schema/index.js';
|
|
12
12
|
import type { AdapterReadRequest, Row } from './adapter.js';
|
|
13
13
|
import type { ChangeSet, Operation } from './contract.js';
|
|
14
14
|
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
import {
|
|
28
28
|
SOURCE_CONNECTOR_PROTOCOL_VERSION,
|
|
29
|
+
SOURCE_CONNECTOR_SUPERSEDED_CLOSE_CODE,
|
|
29
30
|
SOURCE_CONNECTOR_WS_PATH,
|
|
30
31
|
sourceConnectorSubprotocols,
|
|
31
32
|
encodeFrame,
|
|
@@ -35,8 +36,8 @@ import {
|
|
|
35
36
|
type RequestFrame,
|
|
36
37
|
type ResponseFrame,
|
|
37
38
|
type ReadyFrame,
|
|
38
|
-
} from './
|
|
39
|
-
import { ABLO_HOSTED_HTTP_BASE_URL } from '
|
|
39
|
+
} from './protocol.js';
|
|
40
|
+
import { ABLO_HOSTED_HTTP_BASE_URL } from '../../auth/hostedEndpoints.js';
|
|
40
41
|
|
|
41
42
|
/**
|
|
42
43
|
* The default Ablo base URL the connector dials, to which it appends
|
|
@@ -130,6 +131,20 @@ export interface SourceConnector {
|
|
|
130
131
|
run(signal: AbortSignal): Promise<void>;
|
|
131
132
|
}
|
|
132
133
|
|
|
134
|
+
/** The connector lost its source lease to a newer process and will not reconnect. */
|
|
135
|
+
export class SourceConnectorSupersededError extends Error {
|
|
136
|
+
readonly code = 'source_connector_superseded';
|
|
137
|
+
|
|
138
|
+
constructor() {
|
|
139
|
+
super(
|
|
140
|
+
'A newer local connector took ownership of this source; this connector has stopped.',
|
|
141
|
+
);
|
|
142
|
+
this.name = 'SourceConnectorSupersededError';
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
type ConnectionOutcome = 'retry' | 'ready' | 'superseded';
|
|
147
|
+
|
|
133
148
|
export function createSourceConnector(
|
|
134
149
|
options: SourceConnectorOptions,
|
|
135
150
|
): SourceConnector {
|
|
@@ -148,7 +163,7 @@ export function createSourceConnector(
|
|
|
148
163
|
if (signal.aborted) return;
|
|
149
164
|
|
|
150
165
|
options.onStatus?.('connecting');
|
|
151
|
-
const
|
|
166
|
+
const outcome = await connectOnce({
|
|
152
167
|
url,
|
|
153
168
|
apiKey: options.apiKey,
|
|
154
169
|
handler: options.handler,
|
|
@@ -158,9 +173,10 @@ export function createSourceConnector(
|
|
|
158
173
|
onError: options.onError,
|
|
159
174
|
signal,
|
|
160
175
|
});
|
|
176
|
+
if (outcome === 'superseded') return;
|
|
161
177
|
// A connection that reached `ready` resets the backoff so the next
|
|
162
178
|
// drop reconnects immediately; one that never readied keeps escalating.
|
|
163
|
-
attempt =
|
|
179
|
+
attempt = outcome === 'ready' ? 0 : attempt + 1;
|
|
164
180
|
}
|
|
165
181
|
},
|
|
166
182
|
};
|
|
@@ -169,8 +185,10 @@ export function createSourceConnector(
|
|
|
169
185
|
/**
|
|
170
186
|
* Runs one connection: open the socket, register, then serve requests until the
|
|
171
187
|
* socket closes or `signal` aborts. Resolves to whether the connection reached the
|
|
172
|
-
* `ready` state, which the caller uses to reset the reconnect backoff
|
|
173
|
-
*
|
|
188
|
+
* `ready` state, which the caller uses to reset the reconnect backoff, or the
|
|
189
|
+
* terminal `superseded` fence, which stops this process from taking ownership
|
|
190
|
+
* back from its replacement. It never rejects because ordinary transport drops
|
|
191
|
+
* are expected and simply drive a reconnect.
|
|
174
192
|
*/
|
|
175
193
|
function connectOnce(params: {
|
|
176
194
|
readonly url: string;
|
|
@@ -181,8 +199,8 @@ function connectOnce(params: {
|
|
|
181
199
|
readonly onStatus: ((status: ConnectorStatus) => void) | undefined;
|
|
182
200
|
readonly onError: ((error: unknown) => void) | undefined;
|
|
183
201
|
readonly signal: AbortSignal;
|
|
184
|
-
}): Promise<
|
|
185
|
-
return new Promise<
|
|
202
|
+
}): Promise<ConnectionOutcome> {
|
|
203
|
+
return new Promise<ConnectionOutcome>((resolve) => {
|
|
186
204
|
let ws: ConnectorWebSocket;
|
|
187
205
|
try {
|
|
188
206
|
ws = params.factory(
|
|
@@ -191,18 +209,18 @@ function connectOnce(params: {
|
|
|
191
209
|
);
|
|
192
210
|
} catch (err) {
|
|
193
211
|
params.onError?.(err);
|
|
194
|
-
resolve(
|
|
212
|
+
resolve('retry');
|
|
195
213
|
return;
|
|
196
214
|
}
|
|
197
215
|
|
|
198
216
|
let ready = false;
|
|
199
217
|
let settled = false;
|
|
200
|
-
const finish = (): void => {
|
|
218
|
+
const finish = (outcome: ConnectionOutcome = ready ? 'ready' : 'retry'): void => {
|
|
201
219
|
if (settled) return;
|
|
202
220
|
settled = true;
|
|
203
221
|
params.signal.removeEventListener('abort', onAbort);
|
|
204
222
|
params.onStatus?.('disconnected');
|
|
205
|
-
resolve(
|
|
223
|
+
resolve(outcome);
|
|
206
224
|
};
|
|
207
225
|
|
|
208
226
|
const onAbort = (): void => {
|
|
@@ -243,7 +261,12 @@ function connectOnce(params: {
|
|
|
243
261
|
// `close` always follows `error`; finish() runs there.
|
|
244
262
|
});
|
|
245
263
|
|
|
246
|
-
ws.addEventListener('close', () => {
|
|
264
|
+
ws.addEventListener('close', (event) => {
|
|
265
|
+
if (event.code === SOURCE_CONNECTOR_SUPERSEDED_CLOSE_CODE) {
|
|
266
|
+
params.onError?.(new SourceConnectorSupersededError());
|
|
267
|
+
finish('superseded');
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
247
270
|
finish();
|
|
248
271
|
});
|
|
249
272
|
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
|
|
23
23
|
import { z } from 'zod';
|
|
24
24
|
|
|
25
|
-
import { environmentSchema } from '
|
|
26
|
-
import { WS_BEARER_SUBPROTOCOL_PREFIX } from '
|
|
25
|
+
import { environmentSchema } from '../../environment.js';
|
|
26
|
+
import { WS_BEARER_SUBPROTOCOL_PREFIX } from '../../auth/credentialSource.js';
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* The wire-protocol version. It increases on any breaking change to a frame's
|
|
@@ -43,6 +43,14 @@ export const SOURCE_CONNECTOR_WS_PATH = '/v1/source/listen';
|
|
|
43
43
|
*/
|
|
44
44
|
export const WS_SOURCE_SUBPROTOCOL = 'ablo.source.v1';
|
|
45
45
|
|
|
46
|
+
/**
|
|
47
|
+
* Private WebSocket close code used when a newer connector takes ownership of
|
|
48
|
+
* the same source. This is a fencing decision, not a transient disconnect: the
|
|
49
|
+
* superseded process must stop reconnecting or two `ablo dev --local`
|
|
50
|
+
* processes will continuously replace each other.
|
|
51
|
+
*/
|
|
52
|
+
export const SOURCE_CONNECTOR_SUPERSEDED_CLOSE_CODE = 4009;
|
|
53
|
+
|
|
46
54
|
/**
|
|
47
55
|
* Builds the `Sec-WebSocket-Protocol` list a connector offers during the
|
|
48
56
|
* handshake: the source subprotocol followed by the bearer credential, encoded as
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
* interface against your own outbox table for production durability.
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
-
import { ABLO_SOURCE_HEADERS, signAbloSourceRequest } from '
|
|
27
|
-
import type { SourceEvent } from '
|
|
26
|
+
import { ABLO_SOURCE_HEADERS, signAbloSourceRequest } from '../endpoint/signing.js';
|
|
27
|
+
import type { SourceEvent } from '../types.js';
|
|
28
28
|
|
|
29
29
|
/** One queued delivery: a batch of source events plus its retry bookkeeping. */
|
|
30
30
|
export interface PushQueueItem {
|
|
@@ -10,18 +10,18 @@ import type {
|
|
|
10
10
|
Schema,
|
|
11
11
|
SchemaRecord,
|
|
12
12
|
InferCreate,
|
|
13
|
-
} from '
|
|
14
|
-
import type { DataSourceAdapter } from '
|
|
15
|
-
import type { AdapterReadRequest, Row } from '
|
|
16
|
-
import { changeSetSchema } from '
|
|
17
|
-
import { AbloError, AbloPermissionError } from '
|
|
13
|
+
} from '../../schema/schema.js';
|
|
14
|
+
import type { DataSourceAdapter } from '../adapters/adapter.js';
|
|
15
|
+
import type { AdapterReadRequest, Row } from '../adapters/adapter.js';
|
|
16
|
+
import { changeSetSchema } from '../adapters/contract.js';
|
|
17
|
+
import { AbloError, AbloPermissionError } from '../../errors.js';
|
|
18
18
|
import {
|
|
19
19
|
authorizeSourceChange,
|
|
20
20
|
authorizeSourceRead,
|
|
21
21
|
lockSourceSubjectCreates,
|
|
22
22
|
sourceSubjectRule,
|
|
23
23
|
sourceSubjectValues,
|
|
24
|
-
} from '
|
|
24
|
+
} from '../adapters/subjectAuthorization.js';
|
|
25
25
|
import {
|
|
26
26
|
SourceSignatureError,
|
|
27
27
|
verifyAbloSourceRequest,
|
|
@@ -41,7 +41,7 @@ import type {
|
|
|
41
41
|
SourceRequestContext,
|
|
42
42
|
SourceScope,
|
|
43
43
|
SourceSubjectTransactionHandler,
|
|
44
|
-
} from '
|
|
44
|
+
} from '../types.js';
|
|
45
45
|
|
|
46
46
|
type SourceModels<S extends SchemaRecord, TAuth> = Partial<{
|
|
47
47
|
readonly [K in keyof S & string]: SourceModelHandlers<
|
|
@@ -204,15 +204,19 @@ async function handleViaAdapter(
|
|
|
204
204
|
}
|
|
205
205
|
|
|
206
206
|
if (body.type === 'events') {
|
|
207
|
+
if (body.acknowledgedThrough) {
|
|
208
|
+
await adapter.acknowledgeEvents(body.acknowledgedThrough);
|
|
209
|
+
}
|
|
207
210
|
const page = await adapter.events(body.cursor ?? null, body.limit ?? 100);
|
|
208
211
|
return json({
|
|
209
212
|
events: page.events.map((event) => ({
|
|
210
213
|
id: event.id,
|
|
214
|
+
version: event.version,
|
|
211
215
|
model: event.model,
|
|
212
216
|
entityId: event.entityId,
|
|
213
217
|
type: event.type,
|
|
214
218
|
...(event.data !== undefined && event.data !== null ? { data: event.data } : {}),
|
|
215
|
-
syncGroups: event.syncGroups,
|
|
219
|
+
...(event.syncGroups ? { syncGroups: event.syncGroups } : {}),
|
|
216
220
|
...(event.organizationId ? { organizationId: event.organizationId } : {}),
|
|
217
221
|
...(event.clientTxId ? { clientTxId: event.clientTxId } : {}),
|
|
218
222
|
...(event.correlationId ? { correlationId: event.correlationId } : {}),
|
|
@@ -564,6 +568,7 @@ export function dataSource<const S extends SchemaRecord, TAuth = unknown>(
|
|
|
564
568
|
}
|
|
565
569
|
const result = await options.events({
|
|
566
570
|
cursor: body.cursor,
|
|
571
|
+
acknowledgedThrough: body.acknowledgedThrough,
|
|
567
572
|
limit: body.limit,
|
|
568
573
|
context,
|
|
569
574
|
});
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* `POST` so your route file can export it in one line.
|
|
6
6
|
*
|
|
7
7
|
* // app/api/ablo/source/route.ts
|
|
8
|
-
* import { dataSourceNext } from '@abloatai/transaction/source/
|
|
8
|
+
* import { dataSourceNext } from '@abloatai/transaction/source/endpoint';
|
|
9
9
|
* import { prismaDataSource } from '@abloatai/transaction/source';
|
|
10
10
|
* import { schema } from '@/ablo/schema';
|
|
11
11
|
* import { prisma } from '@/lib/prisma';
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* directly and export its result however that framework expects.
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
|
-
import type { SchemaRecord } from '
|
|
23
|
+
import type { SchemaRecord } from '../../schema/schema.js';
|
|
24
24
|
import { dataSource, type DataSourceOptions } from './factory.js';
|
|
25
25
|
|
|
26
26
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Canonically signs and verifies source requests using the Standard Webhooks scheme.
|
|
2
|
+
* Canonically signs and verifies source endpoint requests using the Standard Webhooks scheme.
|
|
3
3
|
*
|
|
4
4
|
* Every request Ablo sends to a data source is signed with that source's API
|
|
5
5
|
* key, and the receiving endpoint verifies the signature before any handler
|
package/src/source/index.ts
CHANGED
|
@@ -56,16 +56,16 @@ export {
|
|
|
56
56
|
type SourceSignatureOptions,
|
|
57
57
|
type SourceSignatureVerificationOptions,
|
|
58
58
|
type SourceSignatureVerificationResult,
|
|
59
|
-
} from './signing.js';
|
|
59
|
+
} from './endpoint/signing.js';
|
|
60
60
|
|
|
61
61
|
export {
|
|
62
62
|
dataSource,
|
|
63
63
|
type DataSourceOptions,
|
|
64
|
-
} from './factory.js';
|
|
64
|
+
} from './endpoint/factory.js';
|
|
65
65
|
|
|
66
66
|
export {
|
|
67
67
|
sourceSubjectCreateLockKey,
|
|
68
|
-
} from './subjectAuthorization.js';
|
|
68
|
+
} from './adapters/subjectAuthorization.js';
|
|
69
69
|
|
|
70
70
|
export {
|
|
71
71
|
createPushQueue,
|
|
@@ -75,7 +75,7 @@ export {
|
|
|
75
75
|
type PushQueueItem,
|
|
76
76
|
type PushQueueOptions,
|
|
77
77
|
type PushQueueStorage,
|
|
78
|
-
} from './pushQueue.js';
|
|
78
|
+
} from './delivery/pushQueue.js';
|
|
79
79
|
|
|
80
80
|
// The reverse-channel connector — an outbound transport for the load, list, and
|
|
81
81
|
// commit leg, and the dial-out counterpart to `createPushQueue`. It lets you serve
|
|
@@ -84,14 +84,16 @@ export {
|
|
|
84
84
|
export {
|
|
85
85
|
createSourceConnector,
|
|
86
86
|
DEFAULT_RECONNECT_SCHEDULE,
|
|
87
|
+
SourceConnectorSupersededError,
|
|
87
88
|
type SourceConnector,
|
|
88
89
|
type SourceConnectorOptions,
|
|
89
90
|
type ConnectorWebSocket,
|
|
90
91
|
type ConnectorWebSocketFactory,
|
|
91
92
|
type ConnectorStatus,
|
|
92
|
-
} from './connector.js';
|
|
93
|
+
} from './connector/client.js';
|
|
93
94
|
export {
|
|
94
95
|
SOURCE_CONNECTOR_PROTOCOL_VERSION,
|
|
96
|
+
SOURCE_CONNECTOR_SUPERSEDED_CLOSE_CODE,
|
|
95
97
|
SOURCE_CONNECTOR_WS_PATH,
|
|
96
98
|
WS_SOURCE_SUBPROTOCOL,
|
|
97
99
|
sourceConnectorSubprotocols,
|
|
@@ -105,7 +107,7 @@ export {
|
|
|
105
107
|
type RequestFrame,
|
|
106
108
|
type ResponseFrame,
|
|
107
109
|
type ErrorFrame,
|
|
108
|
-
} from './
|
|
110
|
+
} from './connector/protocol.js';
|
|
109
111
|
|
|
110
112
|
// The Data Source adapter interface and its Zod contract, with per-ORM implementations.
|
|
111
113
|
export {
|
|
@@ -114,7 +116,7 @@ export {
|
|
|
114
116
|
type AdapterReadRequest,
|
|
115
117
|
type AdapterCommitResult,
|
|
116
118
|
type Row as AdapterRow,
|
|
117
|
-
} from './adapter.js';
|
|
119
|
+
} from './adapters/adapter.js';
|
|
118
120
|
export {
|
|
119
121
|
adapterBindingSchema,
|
|
120
122
|
databaseAdapterProfileSchema,
|
|
@@ -127,8 +129,8 @@ export {
|
|
|
127
129
|
type DatabaseKind,
|
|
128
130
|
type ObservationProfile,
|
|
129
131
|
type PostgresBinding,
|
|
130
|
-
} from './adapterProfile.js';
|
|
131
|
-
export { defineDatabaseAdapter } from './adapterFactory.js';
|
|
132
|
+
} from './adapters/adapterProfile.js';
|
|
133
|
+
export { defineDatabaseAdapter } from './adapters/adapterFactory.js';
|
|
132
134
|
export {
|
|
133
135
|
operationSchema,
|
|
134
136
|
operationTypeSchema,
|
|
@@ -137,25 +139,26 @@ export {
|
|
|
137
139
|
sourceCommitEchoMarkerSchema,
|
|
138
140
|
sourceCommitEchoIntentSchema,
|
|
139
141
|
changeSetSchema,
|
|
140
|
-
outboxEventSchema,
|
|
141
|
-
eventsPageSchema,
|
|
142
|
-
migrationSchema,
|
|
143
142
|
adapterCapabilitiesSchema,
|
|
144
143
|
type Operation,
|
|
145
144
|
type ChangeSet,
|
|
146
|
-
type OutboxEvent,
|
|
147
|
-
type EventsPage,
|
|
148
|
-
type Migration,
|
|
149
145
|
type AdapterCapabilities,
|
|
150
146
|
type SourceCommitEchoMarkerWire,
|
|
151
147
|
type SourceCommitEchoIntent,
|
|
152
|
-
} from './contract.js';
|
|
148
|
+
} from './adapters/contract.js';
|
|
149
|
+
export { migrationSchema, type Migration } from './adapters/migration.js';
|
|
150
|
+
export {
|
|
151
|
+
endpointOutboxMigrations,
|
|
152
|
+
eventsPageSchema,
|
|
153
|
+
outboxEventSchema,
|
|
154
|
+
type EventsPage,
|
|
155
|
+
type OutboxEvent,
|
|
156
|
+
} from './outbox/index.js';
|
|
153
157
|
export { prismaDataSource, type PrismaLike, type PrismaDataSourceOptions } from './adapters/prisma.js';
|
|
154
158
|
export {
|
|
155
159
|
adapterTableMigrations,
|
|
156
|
-
endpointOutboxMigrations,
|
|
157
160
|
idempotencyLedgerMigrations,
|
|
158
|
-
} from './migrations.js';
|
|
161
|
+
} from './adapters/migrations.js';
|
|
159
162
|
export {
|
|
160
163
|
createKyselyMutationAdapter,
|
|
161
164
|
createKyselyMutationCore,
|
|
@@ -183,7 +186,7 @@ export {
|
|
|
183
186
|
encodeSourceEchoTransactionId,
|
|
184
187
|
decodeSourceEchoTransactionId,
|
|
185
188
|
type SourceEchoTransactionId,
|
|
186
|
-
} from './idempotency.js';
|
|
189
|
+
} from './adapters/idempotency.js';
|
|
187
190
|
// What Ablo leaves inside a customer's database, declared once — read by the
|
|
188
191
|
// setup SQL, the replication runtime, and the audit that reports it back.
|
|
189
192
|
export {
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { commitOperationTypeSchema } from '../../coordination/schema.js';
|
|
3
|
+
import { correlationIdSchema } from '../../commit/contract.js';
|
|
4
|
+
import { ABLO_SOURCE_CLIENT_TX_ID_MAX_LENGTH } from '../types.js';
|
|
5
|
+
|
|
6
|
+
const jsonObject = z.record(z.string(), z.unknown());
|
|
7
|
+
|
|
8
|
+
/** The immutable, versioned event envelope stored in `ablo_outbox`. */
|
|
9
|
+
export const outboxEventSchema = z.object({
|
|
10
|
+
/** Version 1 predates durable routes; version 2 captures them atomically. */
|
|
11
|
+
version: z.union([z.literal(1), z.literal(2)]),
|
|
12
|
+
/** Stable, globally unique replay-protection identity. */
|
|
13
|
+
id: z.string().min(1),
|
|
14
|
+
model: z.string().min(1),
|
|
15
|
+
entityId: z.string().min(1),
|
|
16
|
+
type: commitOperationTypeSchema,
|
|
17
|
+
/** Declared schema-field names, never physical database column names. */
|
|
18
|
+
data: jsonObject.nullish(),
|
|
19
|
+
/** Exact routes captured in the writing transaction; version 2 requires them. */
|
|
20
|
+
syncGroups: z.array(z.string().min(1)).readonly().optional(),
|
|
21
|
+
organizationId: z.string().nullish(),
|
|
22
|
+
clientTxId: z.string().nullish(),
|
|
23
|
+
correlationId: correlationIdSchema.nullish(),
|
|
24
|
+
transactionId: z
|
|
25
|
+
.string()
|
|
26
|
+
.min(1)
|
|
27
|
+
.max(ABLO_SOURCE_CLIENT_TX_ID_MAX_LENGTH)
|
|
28
|
+
.nullish(),
|
|
29
|
+
occurredAt: z.number().nullish(),
|
|
30
|
+
/** Monotonic database position, represented as a string to preserve bigint. */
|
|
31
|
+
cursor: z.string().min(1),
|
|
32
|
+
}).superRefine((event, ctx) => {
|
|
33
|
+
if (event.version === 1 && event.syncGroups !== undefined) {
|
|
34
|
+
ctx.addIssue({
|
|
35
|
+
code: 'custom',
|
|
36
|
+
path: ['syncGroups'],
|
|
37
|
+
message: 'Outbox event version 1 cannot carry syncGroups',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (event.version === 2 && event.syncGroups === undefined) {
|
|
41
|
+
ctx.addIssue({
|
|
42
|
+
code: 'custom',
|
|
43
|
+
path: ['syncGroups'],
|
|
44
|
+
message: 'Outbox event version 2 requires durable syncGroups',
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
export type OutboxEvent = z.infer<typeof outboxEventSchema>;
|
|
50
|
+
|
|
51
|
+
export const eventsPageSchema = z.object({
|
|
52
|
+
events: z.array(outboxEventSchema),
|
|
53
|
+
nextCursor: z.string().nullable(),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
export type EventsPage = z.infer<typeof eventsPageSchema>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { AbloValidationError } from '../../errors.js';
|
|
2
|
+
import { outboxEventSchema, type OutboxEvent } from './contract.js';
|
|
3
|
+
|
|
4
|
+
/** Decode the versioned routing envelope without turning absence into `[]`. */
|
|
5
|
+
export function decodeOutboxEventEnvelope(
|
|
6
|
+
eventVersion: unknown,
|
|
7
|
+
syncGroups: unknown,
|
|
8
|
+
cursor: unknown,
|
|
9
|
+
): { readonly version: 1 | 2; readonly syncGroups?: readonly string[] } {
|
|
10
|
+
const version = eventVersion == null
|
|
11
|
+
? (Array.isArray(syncGroups) ? 2 : 1)
|
|
12
|
+
: Number(eventVersion);
|
|
13
|
+
if (version !== 1 && version !== 2) {
|
|
14
|
+
throw new AbloValidationError(
|
|
15
|
+
`Endpoint outbox event at cursor ${String(cursor)} has unsupported event version ${String(eventVersion)}.`,
|
|
16
|
+
{ code: 'source_event_invalid' },
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
if (version === 2 && !Array.isArray(syncGroups)) {
|
|
20
|
+
throw new AbloValidationError(
|
|
21
|
+
`Endpoint outbox event at cursor ${String(cursor)} is version 2 but has no durable sync_groups.`,
|
|
22
|
+
{ code: 'source_event_invalid' },
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
return version === 2
|
|
26
|
+
? { version, syncGroups: syncGroups as readonly string[] }
|
|
27
|
+
: { version };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Canonical snake_case database row → versioned source event decoder. */
|
|
31
|
+
export function decodeDatabaseOutboxEvent(row: Readonly<Record<string, unknown>>): OutboxEvent {
|
|
32
|
+
const envelope = decodeOutboxEventEnvelope(row.event_version, row.sync_groups, row.cursor);
|
|
33
|
+
return outboxEventSchema.parse({
|
|
34
|
+
...envelope,
|
|
35
|
+
id: row.id,
|
|
36
|
+
model: row.model,
|
|
37
|
+
entityId: row.entity_id,
|
|
38
|
+
type: row.type,
|
|
39
|
+
data: typeof row.data === 'string' ? JSON.parse(row.data) : row.data ?? null,
|
|
40
|
+
organizationId: row.organization_id ?? null,
|
|
41
|
+
clientTxId: row.client_tx_id ?? null,
|
|
42
|
+
correlationId: row.correlation_id ?? null,
|
|
43
|
+
transactionId: row.transaction_id ?? null,
|
|
44
|
+
occurredAt: row.occurred_at != null ? Number(row.occurred_at) : null,
|
|
45
|
+
cursor: String(row.cursor),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Endpoint transactional-outbox subsystem.
|
|
3
|
+
*
|
|
4
|
+
* Start here, then descend into contract, envelope, migrations, or retention.
|
|
5
|
+
* ORM adapters depend on this boundary; the subsystem never depends on them.
|
|
6
|
+
*/
|
|
7
|
+
export {
|
|
8
|
+
outboxEventSchema,
|
|
9
|
+
eventsPageSchema,
|
|
10
|
+
type OutboxEvent,
|
|
11
|
+
type EventsPage,
|
|
12
|
+
} from './contract.js';
|
|
13
|
+
export { decodeDatabaseOutboxEvent, decodeOutboxEventEnvelope } from './envelope.js';
|
|
14
|
+
export { endpointOutboxMigrations } from './migrations.js';
|
|
15
|
+
export { ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE } from './retention.js';
|