@abloatai/transaction 0.57.0 → 0.59.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} +8 -18
- 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/client/surface.d.ts +15 -0
- package/dist/client/surface.d.ts.map +1 -0
- package/dist/client/surface.js +29 -0
- package/dist/client/surface.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 +26 -12
- package/dist/pricing.d.ts.map +1 -1
- package/dist/pricing.js +61 -27
- package/dist/pricing.js.map +1 -1
- package/dist/schema/ddl.d.ts.map +1 -1
- package/dist/schema/ddl.js +1 -1
- package/dist/schema/ddl.js.map +1 -1
- package/dist/schema/deployment/backfill.d.ts +44 -0
- package/dist/schema/deployment/backfill.d.ts.map +1 -0
- package/dist/schema/deployment/backfill.js +57 -0
- package/dist/schema/deployment/backfill.js.map +1 -0
- package/dist/schema/deployment/contracts.d.ts +526 -0
- package/dist/schema/deployment/contracts.d.ts.map +1 -0
- package/dist/schema/deployment/contracts.js +77 -0
- package/dist/schema/deployment/contracts.js.map +1 -0
- package/dist/schema/deployment/fingerprint.d.ts +3 -0
- package/dist/schema/deployment/fingerprint.d.ts.map +1 -0
- package/dist/schema/deployment/fingerprint.js +18 -0
- package/dist/schema/deployment/fingerprint.js.map +1 -0
- package/dist/schema/deployment/index.d.ts +18 -0
- package/dist/schema/deployment/index.d.ts.map +1 -0
- package/dist/schema/deployment/index.js +71 -0
- package/dist/schema/deployment/index.js.map +1 -0
- package/dist/schema/deployment/postgresCatalog.d.ts +39 -0
- package/dist/schema/deployment/postgresCatalog.d.ts.map +1 -0
- package/dist/schema/deployment/postgresCatalog.js +86 -0
- package/dist/schema/deployment/postgresCatalog.js.map +1 -0
- package/dist/schema/deployment/reconcile.d.ts +20 -0
- package/dist/schema/deployment/reconcile.d.ts.map +1 -0
- package/dist/schema/deployment/reconcile.js +226 -0
- package/dist/schema/deployment/reconcile.js.map +1 -0
- package/dist/schema/deployment/sequence.d.ts +4 -0
- package/dist/schema/deployment/sequence.d.ts.map +1 -0
- package/dist/schema/deployment/sequence.js +71 -0
- package/dist/schema/deployment/sequence.js.map +1 -0
- package/dist/schema/index.d.ts +6 -6
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +8 -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} +10 -22
- 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/client/surface.ts +50 -0
- 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 +61 -26
- package/src/schema/ddl.ts +3 -1
- package/src/schema/deployment/backfill.ts +88 -0
- package/src/schema/deployment/contracts.ts +119 -0
- package/src/schema/deployment/fingerprint.ts +13 -0
- package/src/schema/deployment/index.ts +81 -0
- package/src/schema/deployment/postgresCatalog.ts +131 -0
- package/src/schema/deployment/reconcile.ts +219 -0
- package/src/schema/deployment/sequence.ts +85 -0
- package/src/schema/index.ts +9 -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
|
@@ -24,27 +24,27 @@ import type {
|
|
|
24
24
|
DataSourceAdapter,
|
|
25
25
|
MutationAdapter,
|
|
26
26
|
Row,
|
|
27
|
-
} from '
|
|
28
|
-
import { defineDatabaseAdapter } from '
|
|
29
|
-
import { postgresAdapterProfile } from '
|
|
30
|
-
import type { ChangeSet
|
|
27
|
+
} from './adapter.js';
|
|
28
|
+
import { defineDatabaseAdapter } from './adapterFactory.js';
|
|
29
|
+
import { postgresAdapterProfile } from './adapterProfile.js';
|
|
30
|
+
import type { ChangeSet } from './contract.js';
|
|
31
|
+
import type { Migration } from './migration.js';
|
|
31
32
|
import {
|
|
32
33
|
changeSetSchema,
|
|
33
|
-
outboxEventSchema,
|
|
34
34
|
sourceCommitEchoMarkerSchema,
|
|
35
35
|
sourceCommitEchoIntentSchema,
|
|
36
36
|
type SourceCommitEchoIntent,
|
|
37
|
-
} from '
|
|
37
|
+
} from './contract.js';
|
|
38
38
|
import {
|
|
39
39
|
assertSourceIdempotencyIntent,
|
|
40
40
|
assertSourceIdempotencyRetention,
|
|
41
41
|
sourceChangeIntentHash,
|
|
42
42
|
SOURCE_IDEMPOTENCY_RETENTION,
|
|
43
|
-
} from '
|
|
43
|
+
} from './idempotency.js';
|
|
44
44
|
import {
|
|
45
45
|
adapterTableMigrations,
|
|
46
46
|
idempotencyLedgerMigrations,
|
|
47
|
-
} from '
|
|
47
|
+
} from './migrations.js';
|
|
48
48
|
import { ABLO_POSTGRES_COMMIT_ECHO_PREFIX } from '../types.js';
|
|
49
49
|
import {
|
|
50
50
|
authorizeSourceChange,
|
|
@@ -52,7 +52,12 @@ import {
|
|
|
52
52
|
lockSourceSubjectCreates,
|
|
53
53
|
rethrowStrictCreateConflict,
|
|
54
54
|
sourceSyncGroups,
|
|
55
|
-
} from '
|
|
55
|
+
} from './subjectAuthorization.js';
|
|
56
|
+
import {
|
|
57
|
+
decodeDatabaseOutboxEvent,
|
|
58
|
+
ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE,
|
|
59
|
+
type EventsPage,
|
|
60
|
+
} from '../outbox/index.js';
|
|
56
61
|
import {
|
|
57
62
|
createKyselyMutationCore,
|
|
58
63
|
kyselyOperationRowId,
|
|
@@ -403,6 +408,7 @@ export function createKyselyMutationAdapter(
|
|
|
403
408
|
entity_id: entityId,
|
|
404
409
|
type: operation.type,
|
|
405
410
|
data: operation.type === 'DELETE' ? null : JSON.stringify(row),
|
|
411
|
+
event_version: 2,
|
|
406
412
|
sync_groups: options.schema
|
|
407
413
|
? sourceSyncGroups(options.schema, operation.model, row)
|
|
408
414
|
: [],
|
|
@@ -449,6 +455,22 @@ export function kyselyDataSource<S extends SchemaRecord>(
|
|
|
449
455
|
...mutation,
|
|
450
456
|
capabilities: { ...mutation.capabilities, outboxEvents: true },
|
|
451
457
|
|
|
458
|
+
async acknowledgeEvents(acknowledgedThrough: string): Promise<void> {
|
|
459
|
+
await db.transaction().execute(async (transaction) => {
|
|
460
|
+
await transaction.executeQuery(
|
|
461
|
+
rawQuery(
|
|
462
|
+
'ablo-outbox-prune-acknowledged',
|
|
463
|
+
`DELETE FROM ablo_outbox
|
|
464
|
+
WHERE cursor IN (
|
|
465
|
+
SELECT cursor FROM ablo_outbox
|
|
466
|
+
WHERE cursor <= $1 ORDER BY cursor ASC LIMIT $2
|
|
467
|
+
)`,
|
|
468
|
+
[acknowledgedThrough, ENDPOINT_OUTBOX_PRUNE_BATCH_SIZE],
|
|
469
|
+
),
|
|
470
|
+
);
|
|
471
|
+
});
|
|
472
|
+
},
|
|
473
|
+
|
|
452
474
|
async events(cursor: string | null, limit: number): Promise<EventsPage> {
|
|
453
475
|
const rows = await db
|
|
454
476
|
.selectFrom('ablo_outbox')
|
|
@@ -457,22 +479,7 @@ export function kyselyDataSource<S extends SchemaRecord>(
|
|
|
457
479
|
.orderBy('cursor', 'asc')
|
|
458
480
|
.limit(limit)
|
|
459
481
|
.execute();
|
|
460
|
-
const events = rows.map(
|
|
461
|
-
outboxEventSchema.parse({
|
|
462
|
-
id: row.id,
|
|
463
|
-
model: row.model,
|
|
464
|
-
entityId: row.entity_id,
|
|
465
|
-
type: row.type,
|
|
466
|
-
data: typeof row.data === 'string' ? JSON.parse(row.data) : row.data ?? null,
|
|
467
|
-
syncGroups: row.sync_groups ?? [],
|
|
468
|
-
organizationId: row.organization_id ?? null,
|
|
469
|
-
clientTxId: row.client_tx_id ?? null,
|
|
470
|
-
correlationId: row.correlation_id ?? null,
|
|
471
|
-
transactionId: row.transaction_id ?? null,
|
|
472
|
-
occurredAt: row.occurred_at != null ? Number(row.occurred_at) : null,
|
|
473
|
-
cursor: String(row.cursor),
|
|
474
|
-
}),
|
|
475
|
-
);
|
|
482
|
+
const events = rows.map(decodeDatabaseOutboxEvent);
|
|
476
483
|
return { events, nextCursor: events.at(-1)?.cursor ?? null };
|
|
477
484
|
},
|
|
478
485
|
});
|
|
@@ -13,9 +13,9 @@ import type { Schema, SchemaRecord } from '../../schema/schema.js';
|
|
|
13
13
|
import { toSchemaJSON } from '../../schema/serialize.js';
|
|
14
14
|
import { camelToSnake, snakeToCamel } from '../../schema/ddl.js';
|
|
15
15
|
import { tenancyColumn } from '../../schema/tenancy.js';
|
|
16
|
-
import type { AdapterReadRequest, Row } from '
|
|
17
|
-
import type { Operation } from '
|
|
18
|
-
import { sourceSubjectRule, sourceSubjectValues } from '
|
|
16
|
+
import type { AdapterReadRequest, Row } from './adapter.js';
|
|
17
|
+
import type { Operation } from './contract.js';
|
|
18
|
+
import { sourceSubjectRule, sourceSubjectValues } from './subjectAuthorization.js';
|
|
19
19
|
|
|
20
20
|
/** The subset of a Kysely instance, or transaction handle, used by the core. */
|
|
21
21
|
export interface KyselyLike {
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* mapper is complete when it passes the same suite this one passes.
|
|
7
7
|
*
|
|
8
8
|
* It models the semantics minimally but faithfully: one row store per model, an
|
|
9
|
-
* idempotency ledger keyed by scoped correlation, and an
|
|
10
|
-
* monotonic cursor.
|
|
9
|
+
* idempotency ledger keyed by scoped correlation, and an acknowledgement-pruned
|
|
10
|
+
* outbox with a monotonic cursor.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { AbloValidationError } from '../../errors.js';
|
|
@@ -16,14 +16,16 @@ import type {
|
|
|
16
16
|
AdapterReadRequest,
|
|
17
17
|
DataSourceAdapter,
|
|
18
18
|
Row,
|
|
19
|
-
} from '
|
|
20
|
-
import { defineDatabaseAdapter } from '
|
|
21
|
-
import { memoryAdapterProfile } from '
|
|
22
|
-
import type { ChangeSet,
|
|
19
|
+
} from './adapter.js';
|
|
20
|
+
import { defineDatabaseAdapter } from './adapterFactory.js';
|
|
21
|
+
import { memoryAdapterProfile } from './adapterProfile.js';
|
|
22
|
+
import type { ChangeSet, Operation } from './contract.js';
|
|
23
|
+
import type { Migration } from './migration.js';
|
|
24
|
+
import type { EventsPage, OutboxEvent } from '../outbox/index.js';
|
|
23
25
|
import {
|
|
24
26
|
assertSourceIdempotencyIntent,
|
|
25
27
|
sourceChangeIntentHash,
|
|
26
|
-
} from '
|
|
28
|
+
} from './idempotency.js';
|
|
27
29
|
|
|
28
30
|
function rowId(op: Operation): string {
|
|
29
31
|
const id = op.id ?? (op.input?.id as string | undefined);
|
|
@@ -41,8 +43,9 @@ export function memoryDataSource(): DataSourceAdapter {
|
|
|
41
43
|
string,
|
|
42
44
|
{ readonly requestHash: string; readonly rows: Row[] }
|
|
43
45
|
>();
|
|
44
|
-
/**
|
|
46
|
+
/** Acknowledgement-pruned outbox with a monotonic cursor. */
|
|
45
47
|
const outbox: OutboxEvent[] = [];
|
|
48
|
+
let nextOutboxCursor = 1;
|
|
46
49
|
|
|
47
50
|
const modelStore = (model: string): Map<string, Row> => {
|
|
48
51
|
let m = store.get(model);
|
|
@@ -136,6 +139,7 @@ export function memoryDataSource(): DataSourceAdapter {
|
|
|
136
139
|
rows.push(row);
|
|
137
140
|
// Transactional outbox: one event per op, monotonic cursor.
|
|
138
141
|
outbox.push({
|
|
142
|
+
version: 2,
|
|
139
143
|
id: `${change.correlationId}:${index}`,
|
|
140
144
|
model: op.model,
|
|
141
145
|
entityId: String(row.id ?? rowId(op)),
|
|
@@ -144,13 +148,25 @@ export function memoryDataSource(): DataSourceAdapter {
|
|
|
144
148
|
syncGroups: [],
|
|
145
149
|
correlationId: change.correlationId,
|
|
146
150
|
...(op.transactionId ? { transactionId: op.transactionId } : {}),
|
|
147
|
-
cursor: String(
|
|
151
|
+
cursor: String(nextOutboxCursor++),
|
|
148
152
|
});
|
|
149
153
|
}
|
|
150
154
|
idempotency.set(change.correlationId, { requestHash, rows });
|
|
151
155
|
return { rows };
|
|
152
156
|
},
|
|
153
157
|
|
|
158
|
+
async acknowledgeEvents(acknowledgedThrough: string): Promise<void> {
|
|
159
|
+
const after = Number(acknowledgedThrough);
|
|
160
|
+
let acknowledgedCount = 0;
|
|
161
|
+
while (
|
|
162
|
+
acknowledgedCount < outbox.length &&
|
|
163
|
+
Number(outbox[acknowledgedCount]?.cursor) <= after
|
|
164
|
+
) {
|
|
165
|
+
acknowledgedCount += 1;
|
|
166
|
+
}
|
|
167
|
+
if (acknowledgedCount > 0) outbox.splice(0, acknowledgedCount);
|
|
168
|
+
},
|
|
169
|
+
|
|
154
170
|
async events(cursor: string | null, limit: number): Promise<EventsPage> {
|
|
155
171
|
const after = cursor ? Number(cursor) : 0;
|
|
156
172
|
const page = outbox.filter((e) => Number(e.cursor) > after).slice(0, limit);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/** One forward-only infrastructure migration shipped by an adapter. */
|
|
4
|
+
export const migrationSchema = z.object({
|
|
5
|
+
/** Stable name, used as the migration filename + applied-ledger key. */
|
|
6
|
+
name: z.string().min(1),
|
|
7
|
+
/** The forward SQL. */
|
|
8
|
+
up: z.string().min(1),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export type Migration = z.infer<typeof migrationSchema>;
|
|
@@ -10,7 +10,10 @@
|
|
|
10
10
|
* it records changes in its own `sync_deltas` log instead.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import type { Migration } from './
|
|
13
|
+
import type { Migration } from './migration.js';
|
|
14
|
+
import { endpointOutboxMigrations } from '../outbox/index.js';
|
|
15
|
+
|
|
16
|
+
export { endpointOutboxMigrations } from '../outbox/index.js';
|
|
14
17
|
|
|
15
18
|
/**
|
|
16
19
|
* Add a column to `ablo_idempotency` only when it is genuinely missing.
|
|
@@ -87,58 +90,7 @@ export function idempotencyLedgerMigrations(schema = 'public'): readonly Migrati
|
|
|
87
90
|
];
|
|
88
91
|
}
|
|
89
92
|
|
|
90
|
-
/** Endpoint-only transactional outbox and its correlation columns. */
|
|
91
|
-
export function endpointOutboxMigrations(): readonly Migration[] {
|
|
92
|
-
return [
|
|
93
|
-
{
|
|
94
|
-
name: 'ablo_outbox',
|
|
95
|
-
up: `CREATE TABLE IF NOT EXISTS ablo_outbox (
|
|
96
|
-
cursor BIGSERIAL PRIMARY KEY,
|
|
97
|
-
id TEXT NOT NULL UNIQUE,
|
|
98
|
-
model TEXT NOT NULL,
|
|
99
|
-
entity_id TEXT NOT NULL,
|
|
100
|
-
type TEXT NOT NULL,
|
|
101
|
-
data JSONB,
|
|
102
|
-
sync_groups TEXT[] NOT NULL,
|
|
103
|
-
organization_id TEXT,
|
|
104
|
-
client_tx_id TEXT,
|
|
105
|
-
correlation_id TEXT,
|
|
106
|
-
transaction_id TEXT,
|
|
107
|
-
occurred_at BIGINT,
|
|
108
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
109
|
-
);`,
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
name: 'ablo_outbox_correlation',
|
|
113
|
-
up: `ALTER TABLE ablo_outbox
|
|
114
|
-
ADD COLUMN IF NOT EXISTS correlation_id TEXT;
|
|
115
|
-
ALTER TABLE ablo_outbox
|
|
116
|
-
ADD COLUMN IF NOT EXISTS transaction_id TEXT;`,
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
name: 'ablo_outbox_sync_groups',
|
|
120
|
-
up: `DO $$
|
|
121
|
-
BEGIN
|
|
122
|
-
IF NOT EXISTS (
|
|
123
|
-
SELECT 1 FROM information_schema.columns
|
|
124
|
-
WHERE table_schema = current_schema()
|
|
125
|
-
AND table_name = 'ablo_outbox'
|
|
126
|
-
AND column_name = 'sync_groups'
|
|
127
|
-
) AND EXISTS (SELECT 1 FROM ablo_outbox) THEN
|
|
128
|
-
RAISE EXCEPTION USING
|
|
129
|
-
ERRCODE = '55000',
|
|
130
|
-
MESSAGE = 'ablo_outbox contains legacy events; verify the previous release consumed them, then purge those rows before adding sync_groups';
|
|
131
|
-
END IF;
|
|
132
|
-
END $$;
|
|
133
|
-
ALTER TABLE ablo_outbox
|
|
134
|
-
ADD COLUMN IF NOT EXISTS sync_groups TEXT[];
|
|
135
|
-
ALTER TABLE ablo_outbox
|
|
136
|
-
ALTER COLUMN sync_groups SET NOT NULL;`,
|
|
137
|
-
},
|
|
138
|
-
];
|
|
139
|
-
}
|
|
140
|
-
|
|
141
93
|
/** Full endpoint adapter migrations (ledger + outbox). */
|
|
142
|
-
export function adapterTableMigrations(): readonly Migration[] {
|
|
143
|
-
return [...idempotencyLedgerMigrations(), ...endpointOutboxMigrations()];
|
|
94
|
+
export function adapterTableMigrations(schema = 'public'): readonly Migration[] {
|
|
95
|
+
return [...idempotencyLedgerMigrations(schema), ...endpointOutboxMigrations(schema)];
|
|
144
96
|
}
|
|
@@ -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
|