@baruk/core 0.3.1 → 0.4.2
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/.baruk-provenance.json +10 -0
- package/CHANGELOG.md +85 -0
- package/dist/auth/password-reset.d.ts +30 -1
- package/dist/auth/password-reset.d.ts.map +1 -1
- package/dist/auth/password-reset.js +139 -11
- package/dist/auth/password-reset.js.map +1 -1
- package/dist/auth/service.d.ts +39 -2
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +75 -10
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +334 -0
- package/dist/billing/ar-repository.d.ts.map +1 -0
- package/dist/billing/ar-repository.js +707 -0
- package/dist/billing/ar-repository.js.map +1 -0
- package/dist/billing/auto-generation.d.ts +87 -0
- package/dist/billing/auto-generation.d.ts.map +1 -0
- package/dist/billing/auto-generation.js +181 -0
- package/dist/billing/auto-generation.js.map +1 -0
- package/dist/billing/live-guard.d.ts +64 -0
- package/dist/billing/live-guard.d.ts.map +1 -0
- package/dist/billing/live-guard.js +68 -0
- package/dist/billing/live-guard.js.map +1 -0
- package/dist/billing/payment-means-catalog.d.ts +17 -0
- package/dist/billing/payment-means-catalog.d.ts.map +1 -0
- package/dist/billing/payment-means-catalog.js +21 -0
- package/dist/billing/payment-means-catalog.js.map +1 -0
- package/dist/billing/payment-means.d.ts +38 -0
- package/dist/billing/payment-means.d.ts.map +1 -0
- package/dist/billing/payment-means.js +29 -0
- package/dist/billing/payment-means.js.map +1 -0
- package/dist/billing/payment-rail.d.ts +118 -0
- package/dist/billing/payment-rail.d.ts.map +1 -0
- package/dist/billing/payment-rail.js +295 -0
- package/dist/billing/payment-rail.js.map +1 -0
- package/dist/billing/provider/asaas.d.ts +46 -1
- package/dist/billing/provider/asaas.d.ts.map +1 -1
- package/dist/billing/provider/asaas.js +194 -14
- package/dist/billing/provider/asaas.js.map +1 -1
- package/dist/billing/provider/manual.js +1 -1
- package/dist/billing/provider/manual.js.map +1 -1
- package/dist/billing/provider/types.d.ts +115 -8
- package/dist/billing/provider/types.d.ts.map +1 -1
- package/dist/billing/provider-account.d.ts +89 -0
- package/dist/billing/provider-account.d.ts.map +1 -0
- package/dist/billing/provider-account.js +161 -0
- package/dist/billing/provider-account.js.map +1 -0
- package/dist/billing/provider-onboarding.d.ts +67 -0
- package/dist/billing/provider-onboarding.d.ts.map +1 -0
- package/dist/billing/provider-onboarding.js +234 -0
- package/dist/billing/provider-onboarding.js.map +1 -0
- package/dist/billing/receivable.d.ts +5 -1
- package/dist/billing/receivable.d.ts.map +1 -1
- package/dist/billing/reconcile.d.ts +58 -0
- package/dist/billing/reconcile.d.ts.map +1 -0
- package/dist/billing/reconcile.js +138 -0
- package/dist/billing/reconcile.js.map +1 -0
- package/dist/billing/repository.d.ts +90 -1
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +148 -19
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/auth/password-reset.js +141 -11
- package/dist/cjs/auth/password-reset.js.map +1 -1
- package/dist/cjs/auth/service.js +75 -9
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +728 -0
- package/dist/cjs/billing/ar-repository.js.map +1 -0
- package/dist/cjs/billing/auto-generation.js +186 -0
- package/dist/cjs/billing/auto-generation.js.map +1 -0
- package/dist/cjs/billing/live-guard.js +72 -0
- package/dist/cjs/billing/live-guard.js.map +1 -0
- package/dist/cjs/billing/payment-means-catalog.js +25 -0
- package/dist/cjs/billing/payment-means-catalog.js.map +1 -0
- package/dist/cjs/billing/payment-means.js +33 -0
- package/dist/cjs/billing/payment-means.js.map +1 -0
- package/dist/cjs/billing/payment-rail.js +301 -0
- package/dist/cjs/billing/payment-rail.js.map +1 -0
- package/dist/cjs/billing/provider/asaas.js +194 -14
- package/dist/cjs/billing/provider/asaas.js.map +1 -1
- package/dist/cjs/billing/provider/manual.js +1 -1
- package/dist/cjs/billing/provider/manual.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +170 -0
- package/dist/cjs/billing/provider-account.js.map +1 -0
- package/dist/cjs/billing/provider-onboarding.js +239 -0
- package/dist/cjs/billing/provider-onboarding.js.map +1 -0
- package/dist/cjs/billing/reconcile.js +143 -0
- package/dist/cjs/billing/reconcile.js.map +1 -0
- package/dist/cjs/billing/repository.js +150 -18
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/repository.js +96 -20
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +140 -0
- package/dist/cjs/collection/branding.js.map +1 -0
- package/dist/cjs/collection/channel-accounts.js +137 -0
- package/dist/cjs/collection/channel-accounts.js.map +1 -0
- package/dist/cjs/collection/channel.js +17 -0
- package/dist/cjs/collection/channel.js.map +1 -0
- package/dist/cjs/collection/communication-bridge.js +140 -0
- package/dist/cjs/collection/communication-bridge.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +193 -0
- package/dist/cjs/collection/communication-runtime.js.map +1 -0
- package/dist/cjs/collection/consent-repository.js +84 -0
- package/dist/cjs/collection/consent-repository.js.map +1 -0
- package/dist/cjs/collection/copy.js +125 -0
- package/dist/cjs/collection/copy.js.map +1 -0
- package/dist/cjs/collection/delivery-callback.js +151 -0
- package/dist/cjs/collection/delivery-callback.js.map +1 -0
- package/dist/cjs/collection/email-layout.js +252 -0
- package/dist/cjs/collection/email-layout.js.map +1 -0
- package/dist/cjs/collection/engine.js +414 -0
- package/dist/cjs/collection/engine.js.map +1 -0
- package/dist/cjs/collection/format.js +76 -0
- package/dist/cjs/collection/format.js.map +1 -0
- package/dist/cjs/collection/payment-block.js +3 -0
- package/dist/cjs/collection/payment-block.js.map +1 -0
- package/dist/cjs/collection/policy.js +147 -0
- package/dist/cjs/collection/policy.js.map +1 -0
- package/dist/cjs/collection/repository.js +260 -0
- package/dist/cjs/collection/repository.js.map +1 -0
- package/dist/cjs/collection/subject.js +104 -0
- package/dist/cjs/collection/subject.js.map +1 -0
- package/dist/cjs/collection/template-catalog.js +165 -0
- package/dist/cjs/collection/template-catalog.js.map +1 -0
- package/dist/cjs/collection/template.js +78 -0
- package/dist/cjs/collection/template.js.map +1 -0
- package/dist/cjs/communication/adapters/email.js +132 -0
- package/dist/cjs/communication/adapters/email.js.map +1 -0
- package/dist/cjs/communication/adapters/sms.js +127 -0
- package/dist/cjs/communication/adapters/sms.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js +39 -0
- package/dist/cjs/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js +100 -0
- package/dist/cjs/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/cjs/communication/adapters/whatsapp.js +213 -0
- package/dist/cjs/communication/adapters/whatsapp.js.map +1 -0
- package/dist/cjs/communication/audit.js +61 -0
- package/dist/cjs/communication/audit.js.map +1 -0
- package/dist/cjs/communication/capabilities.js +76 -0
- package/dist/cjs/communication/capabilities.js.map +1 -0
- package/dist/cjs/communication/channel.js +53 -0
- package/dist/cjs/communication/channel.js.map +1 -0
- package/dist/cjs/communication/claim.js +228 -0
- package/dist/cjs/communication/claim.js.map +1 -0
- package/dist/cjs/communication/consent.js +43 -0
- package/dist/cjs/communication/consent.js.map +1 -0
- package/dist/cjs/communication/context.js +45 -0
- package/dist/cjs/communication/context.js.map +1 -0
- package/dist/cjs/communication/credentials.js +121 -0
- package/dist/cjs/communication/credentials.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +161 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -0
- package/dist/cjs/communication/dry-run.js +97 -0
- package/dist/cjs/communication/dry-run.js.map +1 -0
- package/dist/cjs/communication/engine.js +483 -0
- package/dist/cjs/communication/engine.js.map +1 -0
- package/dist/cjs/communication/graph.js +50 -0
- package/dist/cjs/communication/graph.js.map +1 -0
- package/dist/cjs/communication/idempotency.js +26 -0
- package/dist/cjs/communication/idempotency.js.map +1 -0
- package/dist/cjs/communication/identity.js +110 -0
- package/dist/cjs/communication/identity.js.map +1 -0
- package/dist/cjs/communication/index.js +135 -0
- package/dist/cjs/communication/index.js.map +1 -0
- package/dist/cjs/communication/onboarding.js +297 -0
- package/dist/cjs/communication/onboarding.js.map +1 -0
- package/dist/cjs/communication/policy.js +16 -0
- package/dist/cjs/communication/policy.js.map +1 -0
- package/dist/cjs/communication/routing.js +77 -0
- package/dist/cjs/communication/routing.js.map +1 -0
- package/dist/cjs/communication/sender-profile.js +128 -0
- package/dist/cjs/communication/sender-profile.js.map +1 -0
- package/dist/cjs/communication/status.js +86 -0
- package/dist/cjs/communication/status.js.map +1 -0
- package/dist/cjs/communication/stores/onboarding.js +135 -0
- package/dist/cjs/communication/stores/onboarding.js.map +1 -0
- package/dist/cjs/communication/stores/postgres.js +458 -0
- package/dist/cjs/communication/stores/postgres.js.map +1 -0
- package/dist/cjs/communication/stores/routing.js +334 -0
- package/dist/cjs/communication/stores/routing.js.map +1 -0
- package/dist/cjs/communication/stores/secrets.js +126 -0
- package/dist/cjs/communication/stores/secrets.js.map +1 -0
- package/dist/cjs/communication/template-provider.js +22 -0
- package/dist/cjs/communication/template-provider.js.map +1 -0
- package/dist/cjs/communication/template.js +63 -0
- package/dist/cjs/communication/template.js.map +1 -0
- package/dist/cjs/communication/webhook-subscription.js +258 -0
- package/dist/cjs/communication/webhook-subscription.js.map +1 -0
- package/dist/cjs/communication/webhook.js +292 -0
- package/dist/cjs/communication/webhook.js.map +1 -0
- package/dist/cjs/competence/repository.js +309 -0
- package/dist/cjs/competence/repository.js.map +1 -0
- package/dist/cjs/contacts/phone.js +192 -0
- package/dist/cjs/contacts/phone.js.map +1 -0
- package/dist/cjs/db/seed-catalog.js +48 -0
- package/dist/cjs/db/seed-catalog.js.map +1 -0
- package/dist/cjs/db/seed.js +15 -7
- package/dist/cjs/db/seed.js.map +1 -1
- package/dist/cjs/documents/repository.js +244 -0
- package/dist/cjs/documents/repository.js.map +1 -0
- package/dist/cjs/documents/requests.js +136 -0
- package/dist/cjs/documents/requests.js.map +1 -0
- package/dist/cjs/index.js +406 -39
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +125 -3
- package/dist/cjs/legal/documents.js.map +1 -1
- package/dist/cjs/legal/types.js +1 -0
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/mail/auth-templates.js +29 -0
- package/dist/cjs/mail/auth-templates.js.map +1 -0
- package/dist/cjs/mail/dedup-store.js +12 -51
- package/dist/cjs/mail/dedup-store.js.map +1 -1
- package/dist/cjs/mail/index.js +16 -4
- package/dist/cjs/mail/index.js.map +1 -1
- package/dist/cjs/mail/provider.js +12 -247
- package/dist/cjs/mail/provider.js.map +1 -1
- package/dist/cjs/mail/resend.js +14 -18
- package/dist/cjs/mail/resend.js.map +1 -1
- package/dist/cjs/mail/sender-resolver.js +12 -11
- package/dist/cjs/mail/sender-resolver.js.map +1 -1
- package/dist/cjs/mail/template-renderer.js +11 -16
- package/dist/cjs/mail/template-renderer.js.map +1 -1
- package/dist/cjs/mail/transactional-outbound.js +117 -0
- package/dist/cjs/mail/transactional-outbound.js.map +1 -0
- package/dist/cjs/mail/types.js +8 -35
- package/dist/cjs/mail/types.js.map +1 -1
- package/dist/cjs/portal/provisioning.js +144 -0
- package/dist/cjs/portal/provisioning.js.map +1 -0
- package/dist/cjs/pricing-engine/canonical.js +42 -0
- package/dist/cjs/pricing-engine/canonical.js.map +1 -0
- package/dist/cjs/pricing-engine/errors.js +6 -1
- package/dist/cjs/pricing-engine/errors.js.map +1 -1
- package/dist/cjs/pricing-engine/index.js +12 -1
- package/dist/cjs/pricing-engine/index.js.map +1 -1
- package/dist/cjs/pricing-engine/pipeline.js +200 -26
- package/dist/cjs/pricing-engine/pipeline.js.map +1 -1
- package/dist/cjs/pricing-engine/shadow-adapter.js +79 -0
- package/dist/cjs/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-diff.js +55 -0
- package/dist/cjs/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-facade.js +85 -0
- package/dist/cjs/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js +19 -0
- package/dist/cjs/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js +34 -0
- package/dist/cjs/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js +42 -0
- package/dist/cjs/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/cjs/rbac/authorize.js +28 -0
- package/dist/cjs/rbac/authorize.js.map +1 -1
- package/dist/cjs/rbac/catalog.js +67 -1
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/rbac/workload-provisioning.js +160 -0
- package/dist/cjs/rbac/workload-provisioning.js.map +1 -0
- package/dist/cjs/rbac/workload.js +191 -0
- package/dist/cjs/rbac/workload.js.map +1 -0
- package/dist/cjs/storage/checksum.js +15 -0
- package/dist/cjs/storage/checksum.js.map +1 -0
- package/dist/cjs/storage/key.js +72 -0
- package/dist/cjs/storage/key.js.map +1 -0
- package/dist/cjs/storage/local.js +100 -0
- package/dist/cjs/storage/local.js.map +1 -0
- package/dist/cjs/storage/r2.js +181 -0
- package/dist/cjs/storage/r2.js.map +1 -0
- package/dist/cjs/storage/registry.js +41 -0
- package/dist/cjs/storage/registry.js.map +1 -0
- package/dist/cjs/storage/types.js +50 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/subscription-billing/provider/asaas.js +32 -7
- package/dist/cjs/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/disabled.js +8 -0
- package/dist/cjs/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/cjs/subscription-billing/provider/registry.js +17 -0
- package/dist/cjs/subscription-billing/provider/registry.js.map +1 -1
- package/dist/cjs/subscription-billing/service.js +57 -8
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/subscription-billing/types.js.map +1 -1
- package/dist/cjs/tenancy/provisioning.js +32 -8
- package/dist/cjs/tenancy/provisioning.js.map +1 -1
- package/dist/cjs/users/repository.js +119 -2
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +81 -0
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/repository.d.ts +42 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +94 -21
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +72 -0
- package/dist/collection/branding.d.ts.map +1 -0
- package/dist/collection/branding.js +136 -0
- package/dist/collection/branding.js.map +1 -0
- package/dist/collection/channel-accounts.d.ts +57 -0
- package/dist/collection/channel-accounts.d.ts.map +1 -0
- package/dist/collection/channel-accounts.js +133 -0
- package/dist/collection/channel-accounts.js.map +1 -0
- package/dist/collection/channel.d.ts +24 -0
- package/dist/collection/channel.d.ts.map +1 -0
- package/dist/collection/channel.js +16 -0
- package/dist/collection/channel.js.map +1 -0
- package/dist/collection/communication-bridge.d.ts +66 -0
- package/dist/collection/communication-bridge.d.ts.map +1 -0
- package/dist/collection/communication-bridge.js +134 -0
- package/dist/collection/communication-bridge.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +95 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -0
- package/dist/collection/communication-runtime.js +187 -0
- package/dist/collection/communication-runtime.js.map +1 -0
- package/dist/collection/consent-repository.d.ts +32 -0
- package/dist/collection/consent-repository.d.ts.map +1 -0
- package/dist/collection/consent-repository.js +79 -0
- package/dist/collection/consent-repository.js.map +1 -0
- package/dist/collection/copy.d.ts +50 -0
- package/dist/collection/copy.d.ts.map +1 -0
- package/dist/collection/copy.js +122 -0
- package/dist/collection/copy.js.map +1 -0
- package/dist/collection/delivery-callback.d.ts +49 -0
- package/dist/collection/delivery-callback.d.ts.map +1 -0
- package/dist/collection/delivery-callback.js +147 -0
- package/dist/collection/delivery-callback.js.map +1 -0
- package/dist/collection/email-layout.d.ts +45 -0
- package/dist/collection/email-layout.d.ts.map +1 -0
- package/dist/collection/email-layout.js +247 -0
- package/dist/collection/email-layout.js.map +1 -0
- package/dist/collection/engine.d.ts +177 -0
- package/dist/collection/engine.d.ts.map +1 -0
- package/dist/collection/engine.js +407 -0
- package/dist/collection/engine.js.map +1 -0
- package/dist/collection/format.d.ts +32 -0
- package/dist/collection/format.d.ts.map +1 -0
- package/dist/collection/format.js +70 -0
- package/dist/collection/format.js.map +1 -0
- package/dist/collection/payment-block.d.ts +24 -0
- package/dist/collection/payment-block.d.ts.map +1 -0
- package/dist/collection/payment-block.js +2 -0
- package/dist/collection/payment-block.js.map +1 -0
- package/dist/collection/policy.d.ts +53 -0
- package/dist/collection/policy.d.ts.map +1 -0
- package/dist/collection/policy.js +141 -0
- package/dist/collection/policy.js.map +1 -0
- package/dist/collection/repository.d.ts +129 -0
- package/dist/collection/repository.d.ts.map +1 -0
- package/dist/collection/repository.js +246 -0
- package/dist/collection/repository.js.map +1 -0
- package/dist/collection/subject.d.ts +66 -0
- package/dist/collection/subject.d.ts.map +1 -0
- package/dist/collection/subject.js +99 -0
- package/dist/collection/subject.js.map +1 -0
- package/dist/collection/template-catalog.d.ts +16 -0
- package/dist/collection/template-catalog.d.ts.map +1 -0
- package/dist/collection/template-catalog.js +162 -0
- package/dist/collection/template-catalog.js.map +1 -0
- package/dist/collection/template.d.ts +37 -0
- package/dist/collection/template.d.ts.map +1 -0
- package/dist/collection/template.js +73 -0
- package/dist/collection/template.js.map +1 -0
- package/dist/communication/adapters/email.d.ts +28 -0
- package/dist/communication/adapters/email.d.ts.map +1 -0
- package/dist/communication/adapters/email.js +129 -0
- package/dist/communication/adapters/email.js.map +1 -0
- package/dist/communication/adapters/sms.d.ts +95 -0
- package/dist/communication/adapters/sms.d.ts.map +1 -0
- package/dist/communication/adapters/sms.js +121 -0
- package/dist/communication/adapters/sms.js.map +1 -0
- package/dist/communication/adapters/whatsapp-language.d.ts +34 -0
- package/dist/communication/adapters/whatsapp-language.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-language.js +36 -0
- package/dist/communication/adapters/whatsapp-language.js.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts +18 -0
- package/dist/communication/adapters/whatsapp-templates.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp-templates.js +97 -0
- package/dist/communication/adapters/whatsapp-templates.js.map +1 -0
- package/dist/communication/adapters/whatsapp.d.ts +29 -0
- package/dist/communication/adapters/whatsapp.d.ts.map +1 -0
- package/dist/communication/adapters/whatsapp.js +210 -0
- package/dist/communication/adapters/whatsapp.js.map +1 -0
- package/dist/communication/audit.d.ts +105 -0
- package/dist/communication/audit.d.ts.map +1 -0
- package/dist/communication/audit.js +56 -0
- package/dist/communication/audit.js.map +1 -0
- package/dist/communication/capabilities.d.ts +88 -0
- package/dist/communication/capabilities.d.ts.map +1 -0
- package/dist/communication/capabilities.js +72 -0
- package/dist/communication/capabilities.js.map +1 -0
- package/dist/communication/channel.d.ts +125 -0
- package/dist/communication/channel.d.ts.map +1 -0
- package/dist/communication/channel.js +47 -0
- package/dist/communication/channel.js.map +1 -0
- package/dist/communication/claim.d.ts +368 -0
- package/dist/communication/claim.d.ts.map +1 -0
- package/dist/communication/claim.js +224 -0
- package/dist/communication/claim.js.map +1 -0
- package/dist/communication/consent.d.ts +65 -0
- package/dist/communication/consent.d.ts.map +1 -0
- package/dist/communication/consent.js +40 -0
- package/dist/communication/consent.js.map +1 -0
- package/dist/communication/context.d.ts +48 -0
- package/dist/communication/context.d.ts.map +1 -0
- package/dist/communication/context.js +41 -0
- package/dist/communication/context.js.map +1 -0
- package/dist/communication/credentials.d.ts +74 -0
- package/dist/communication/credentials.d.ts.map +1 -0
- package/dist/communication/credentials.js +115 -0
- package/dist/communication/credentials.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts +37 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -0
- package/dist/communication/dry-run-scenario.js +158 -0
- package/dist/communication/dry-run-scenario.js.map +1 -0
- package/dist/communication/dry-run.d.ts +40 -0
- package/dist/communication/dry-run.d.ts.map +1 -0
- package/dist/communication/dry-run.js +92 -0
- package/dist/communication/dry-run.js.map +1 -0
- package/dist/communication/engine.d.ts +153 -0
- package/dist/communication/engine.d.ts.map +1 -0
- package/dist/communication/engine.js +480 -0
- package/dist/communication/engine.js.map +1 -0
- package/dist/communication/graph.d.ts +38 -0
- package/dist/communication/graph.d.ts.map +1 -0
- package/dist/communication/graph.js +45 -0
- package/dist/communication/graph.js.map +1 -0
- package/dist/communication/idempotency.d.ts +33 -0
- package/dist/communication/idempotency.d.ts.map +1 -0
- package/dist/communication/idempotency.js +23 -0
- package/dist/communication/idempotency.js.map +1 -0
- package/dist/communication/identity.d.ts +127 -0
- package/dist/communication/identity.d.ts.map +1 -0
- package/dist/communication/identity.js +105 -0
- package/dist/communication/identity.js.map +1 -0
- package/dist/communication/index.d.ts +66 -0
- package/dist/communication/index.d.ts.map +1 -0
- package/dist/communication/index.js +42 -0
- package/dist/communication/index.js.map +1 -0
- package/dist/communication/onboarding.d.ts +223 -0
- package/dist/communication/onboarding.d.ts.map +1 -0
- package/dist/communication/onboarding.js +287 -0
- package/dist/communication/onboarding.js.map +1 -0
- package/dist/communication/policy.d.ts +99 -0
- package/dist/communication/policy.d.ts.map +1 -0
- package/dist/communication/policy.js +13 -0
- package/dist/communication/policy.js.map +1 -0
- package/dist/communication/routing.d.ts +99 -0
- package/dist/communication/routing.d.ts.map +1 -0
- package/dist/communication/routing.js +73 -0
- package/dist/communication/routing.js.map +1 -0
- package/dist/communication/sender-profile.d.ts +100 -0
- package/dist/communication/sender-profile.d.ts.map +1 -0
- package/dist/communication/sender-profile.js +123 -0
- package/dist/communication/sender-profile.js.map +1 -0
- package/dist/communication/status.d.ts +48 -0
- package/dist/communication/status.d.ts.map +1 -0
- package/dist/communication/status.js +79 -0
- package/dist/communication/status.js.map +1 -0
- package/dist/communication/stores/onboarding.d.ts +88 -0
- package/dist/communication/stores/onboarding.d.ts.map +1 -0
- package/dist/communication/stores/onboarding.js +127 -0
- package/dist/communication/stores/onboarding.js.map +1 -0
- package/dist/communication/stores/postgres.d.ts +81 -0
- package/dist/communication/stores/postgres.d.ts.map +1 -0
- package/dist/communication/stores/postgres.js +453 -0
- package/dist/communication/stores/postgres.js.map +1 -0
- package/dist/communication/stores/routing.d.ts +169 -0
- package/dist/communication/stores/routing.d.ts.map +1 -0
- package/dist/communication/stores/routing.js +324 -0
- package/dist/communication/stores/routing.js.map +1 -0
- package/dist/communication/stores/secrets.d.ts +89 -0
- package/dist/communication/stores/secrets.d.ts.map +1 -0
- package/dist/communication/stores/secrets.js +122 -0
- package/dist/communication/stores/secrets.js.map +1 -0
- package/dist/communication/template-provider.d.ts +85 -0
- package/dist/communication/template-provider.d.ts.map +1 -0
- package/dist/communication/template-provider.js +21 -0
- package/dist/communication/template-provider.js.map +1 -0
- package/dist/communication/template.d.ts +87 -0
- package/dist/communication/template.d.ts.map +1 -0
- package/dist/communication/template.js +59 -0
- package/dist/communication/template.js.map +1 -0
- package/dist/communication/webhook-subscription.d.ts +156 -0
- package/dist/communication/webhook-subscription.d.ts.map +1 -0
- package/dist/communication/webhook-subscription.js +252 -0
- package/dist/communication/webhook-subscription.js.map +1 -0
- package/dist/communication/webhook.d.ts +121 -0
- package/dist/communication/webhook.d.ts.map +1 -0
- package/dist/communication/webhook.js +283 -0
- package/dist/communication/webhook.js.map +1 -0
- package/dist/competence/repository.d.ts +147 -0
- package/dist/competence/repository.d.ts.map +1 -0
- package/dist/competence/repository.js +294 -0
- package/dist/competence/repository.js.map +1 -0
- package/dist/contacts/phone.d.ts +70 -0
- package/dist/contacts/phone.d.ts.map +1 -0
- package/dist/contacts/phone.js +186 -0
- package/dist/contacts/phone.js.map +1 -0
- package/dist/db/migrate.js +17 -11
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/seed-catalog.d.ts +18 -0
- package/dist/db/seed-catalog.d.ts.map +1 -0
- package/dist/db/seed-catalog.js +45 -0
- package/dist/db/seed-catalog.js.map +1 -0
- package/dist/db/seed.js +16 -8
- package/dist/db/seed.js.map +1 -1
- package/dist/documents/repository.d.ts +97 -0
- package/dist/documents/repository.d.ts.map +1 -0
- package/dist/documents/repository.js +236 -0
- package/dist/documents/repository.js.map +1 -0
- package/dist/documents/requests.d.ts +73 -0
- package/dist/documents/requests.d.ts.map +1 -0
- package/dist/documents/requests.js +127 -0
- package/dist/documents/requests.js.map +1 -0
- package/dist/index.d.ts +109 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -8
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +125 -3
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +1 -1
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/types.d.ts +32 -1
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js +1 -0
- package/dist/legal/types.js.map +1 -1
- package/dist/mail/auth-templates.d.ts +15 -0
- package/dist/mail/auth-templates.d.ts.map +1 -0
- package/dist/mail/auth-templates.js +26 -0
- package/dist/mail/auth-templates.js.map +1 -0
- package/dist/mail/dedup-store.d.ts +1 -24
- package/dist/mail/dedup-store.d.ts.map +1 -1
- package/dist/mail/dedup-store.js +9 -48
- package/dist/mail/dedup-store.js.map +1 -1
- package/dist/mail/index.d.ts +2 -1
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +13 -2
- package/dist/mail/index.js.map +1 -1
- package/dist/mail/provider.d.ts +2 -30
- package/dist/mail/provider.d.ts.map +1 -1
- package/dist/mail/provider.js +10 -246
- package/dist/mail/provider.js.map +1 -1
- package/dist/mail/resend.d.ts +2 -12
- package/dist/mail/resend.d.ts.map +1 -1
- package/dist/mail/resend.js +11 -17
- package/dist/mail/resend.js.map +1 -1
- package/dist/mail/sender-resolver.d.ts +1 -7
- package/dist/mail/sender-resolver.d.ts.map +1 -1
- package/dist/mail/sender-resolver.js +11 -10
- package/dist/mail/sender-resolver.js.map +1 -1
- package/dist/mail/template-renderer.d.ts +1 -9
- package/dist/mail/template-renderer.d.ts.map +1 -1
- package/dist/mail/template-renderer.js +10 -15
- package/dist/mail/template-renderer.js.map +1 -1
- package/dist/mail/transactional-outbound.d.ts +115 -0
- package/dist/mail/transactional-outbound.d.ts.map +1 -0
- package/dist/mail/transactional-outbound.js +113 -0
- package/dist/mail/transactional-outbound.js.map +1 -0
- package/dist/mail/types.d.ts +2 -142
- package/dist/mail/types.d.ts.map +1 -1
- package/dist/mail/types.js +1 -33
- package/dist/mail/types.js.map +1 -1
- package/dist/portal/provisioning.d.ts +58 -0
- package/dist/portal/provisioning.d.ts.map +1 -0
- package/dist/portal/provisioning.js +139 -0
- package/dist/portal/provisioning.js.map +1 -0
- package/dist/pricing-engine/canonical.d.ts +14 -0
- package/dist/pricing-engine/canonical.d.ts.map +1 -0
- package/dist/pricing-engine/canonical.js +39 -0
- package/dist/pricing-engine/canonical.js.map +1 -0
- package/dist/pricing-engine/errors.d.ts.map +1 -1
- package/dist/pricing-engine/errors.js +6 -1
- package/dist/pricing-engine/errors.js.map +1 -1
- package/dist/pricing-engine/index.d.ts +12 -2
- package/dist/pricing-engine/index.d.ts.map +1 -1
- package/dist/pricing-engine/index.js +6 -1
- package/dist/pricing-engine/index.js.map +1 -1
- package/dist/pricing-engine/pipeline.d.ts.map +1 -1
- package/dist/pricing-engine/pipeline.js +202 -28
- package/dist/pricing-engine/pipeline.js.map +1 -1
- package/dist/pricing-engine/shadow-adapter.d.ts +37 -0
- package/dist/pricing-engine/shadow-adapter.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-adapter.js +75 -0
- package/dist/pricing-engine/shadow-adapter.js.map +1 -0
- package/dist/pricing-engine/shadow-diff.d.ts +26 -0
- package/dist/pricing-engine/shadow-diff.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-diff.js +52 -0
- package/dist/pricing-engine/shadow-diff.js.map +1 -0
- package/dist/pricing-engine/shadow-facade.d.ts +42 -0
- package/dist/pricing-engine/shadow-facade.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-facade.js +82 -0
- package/dist/pricing-engine/shadow-facade.js.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts +64 -0
- package/dist/pricing-engine/shadow-legacy-types.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-legacy-types.js +18 -0
- package/dist/pricing-engine/shadow-legacy-types.js.map +1 -0
- package/dist/pricing-engine/shadow-metrics.d.ts +33 -0
- package/dist/pricing-engine/shadow-metrics.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-metrics.js +31 -0
- package/dist/pricing-engine/shadow-metrics.js.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts +17 -0
- package/dist/pricing-engine/shadow-normalizer.d.ts.map +1 -0
- package/dist/pricing-engine/shadow-normalizer.js +39 -0
- package/dist/pricing-engine/shadow-normalizer.js.map +1 -0
- package/dist/pricing-engine/types.d.ts +2 -0
- package/dist/pricing-engine/types.d.ts.map +1 -1
- package/dist/rbac/authorize.d.ts +12 -0
- package/dist/rbac/authorize.d.ts.map +1 -1
- package/dist/rbac/authorize.js +27 -0
- package/dist/rbac/authorize.js.map +1 -1
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +67 -1
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/rbac/workload-provisioning.d.ts +66 -0
- package/dist/rbac/workload-provisioning.d.ts.map +1 -0
- package/dist/rbac/workload-provisioning.js +153 -0
- package/dist/rbac/workload-provisioning.js.map +1 -0
- package/dist/rbac/workload.d.ts +124 -0
- package/dist/rbac/workload.d.ts.map +1 -0
- package/dist/rbac/workload.js +184 -0
- package/dist/rbac/workload.js.map +1 -0
- package/dist/storage/checksum.d.ts +9 -0
- package/dist/storage/checksum.d.ts.map +1 -0
- package/dist/storage/checksum.js +12 -0
- package/dist/storage/checksum.js.map +1 -0
- package/dist/storage/key.d.ts +37 -0
- package/dist/storage/key.d.ts.map +1 -0
- package/dist/storage/key.js +67 -0
- package/dist/storage/key.js.map +1 -0
- package/dist/storage/local.d.ts +40 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +96 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/r2.d.ts +43 -0
- package/dist/storage/r2.d.ts.map +1 -0
- package/dist/storage/r2.js +177 -0
- package/dist/storage/r2.js.map +1 -0
- package/dist/storage/registry.d.ts +23 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +37 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/types.d.ts +67 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +45 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/subscription-billing/provider/asaas.d.ts +14 -0
- package/dist/subscription-billing/provider/asaas.d.ts.map +1 -1
- package/dist/subscription-billing/provider/asaas.js +32 -7
- package/dist/subscription-billing/provider/asaas.js.map +1 -1
- package/dist/subscription-billing/provider/disabled.d.ts +9 -0
- package/dist/subscription-billing/provider/disabled.d.ts.map +1 -1
- package/dist/subscription-billing/provider/disabled.js +8 -0
- package/dist/subscription-billing/provider/disabled.js.map +1 -1
- package/dist/subscription-billing/provider/registry.d.ts +10 -0
- package/dist/subscription-billing/provider/registry.d.ts.map +1 -1
- package/dist/subscription-billing/provider/registry.js +17 -0
- package/dist/subscription-billing/provider/registry.js.map +1 -1
- package/dist/subscription-billing/service.d.ts +17 -1
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +57 -8
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/subscription-billing/types.d.ts +13 -0
- package/dist/subscription-billing/types.d.ts.map +1 -1
- package/dist/subscription-billing/types.js.map +1 -1
- package/dist/tenancy/provisioning.d.ts.map +1 -1
- package/dist/tenancy/provisioning.js +32 -8
- package/dist/tenancy/provisioning.js.map +1 -1
- package/dist/users/repository.d.ts +38 -0
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +118 -3
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +67 -0
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +78 -0
- package/dist/vault/repository.js.map +1 -1
- package/package.json +13 -4
- package/src/db/migrations/0023_user_invite_activation.sql +15 -0
- package/src/db/migrations/0024_set_user_password_function.sql +32 -0
- package/src/db/migrations/0025_revoke_user_session_function.sql +28 -0
- package/src/db/migrations/0026_documents_and_competence.sql +353 -0
- package/src/db/migrations/0027_receivable_client_isolation.sql +58 -0
- package/src/db/migrations/0028_collection_engine.sql +94 -0
- package/src/db/migrations/0029_payment_rail.sql +107 -0
- package/src/db/migrations/0030_provider_account_uniqueness.sql +22 -0
- package/src/db/migrations/0031_provider_account_environment_scope.sql +21 -0
- package/src/db/migrations/0032_settlement_reversal.sql +76 -0
- package/src/db/migrations/0033_receivable_idempotency.sql +28 -0
- package/src/db/migrations/0034_payment_customer_reconcile.sql +30 -0
- package/src/db/migrations/0035_payment_account_environments.sql +61 -0
- package/src/db/migrations/0036_primary_backfill_under_force_rls.sql +41 -0
- package/src/db/migrations/0037_receivable_generation_source.sql +29 -0
- package/src/db/migrations/0038_notification_channels.sql +175 -0
- package/src/db/migrations/0039_communication_dispatch_claim.sql +193 -0
- package/src/db/migrations/0040_communication_unknown_outcome.sql +99 -0
- package/src/db/migrations/0041_channel_binding_routing.sql +146 -0
- package/src/db/migrations/0042_channel_route_read_isolation.sql +165 -0
- package/src/db/migrations/0043_workload_identity.sql +105 -0
- package/src/db/migrations/0044_channel_onboarding_session.sql +96 -0
- package/dist/cjs/mail/resend-client.js +0 -103
- package/dist/cjs/mail/resend-client.js.map +0 -1
- package/dist/mail/resend-client.d.ts +0 -16
- package/dist/mail/resend-client.d.ts.map +0 -1
- package/dist/mail/resend-client.js +0 -100
- package/dist/mail/resend-client.js.map +0 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contrato canônico de canal do ecossistema — e-mail, WhatsApp, SMS e
|
|
3
|
+
* notificação interna sob a mesma interface.
|
|
4
|
+
*
|
|
5
|
+
* O ponto de desenho está no CONTEÚDO, não na interface. A abstração de canal
|
|
6
|
+
* que já existia na cobrança da SC (`collection/channel.ts`) carregava
|
|
7
|
+
* `subject` + `html` obrigatórios: um payload de e-mail com nome genérico. Um
|
|
8
|
+
* adapter de WhatsApp receberia HTML renderizado e teria de desmontá-lo de
|
|
9
|
+
* volta em texto, e um de SMS idem — o canal vazando para dentro do domínio
|
|
10
|
+
* pela porta do payload.
|
|
11
|
+
*
|
|
12
|
+
* Aqui o conteúdo é uma união discriminada, resolvida DEPOIS que o canal foi
|
|
13
|
+
* escolhido. Cada canal recebe o que sabe entregar, e o compilador recusa o
|
|
14
|
+
* resto.
|
|
15
|
+
*/
|
|
16
|
+
import type { ChannelCapabilities } from './capabilities.js';
|
|
17
|
+
import type { CommunicationContext } from './context.js';
|
|
18
|
+
export type ChannelKey = 'email' | 'whatsapp' | 'sms' | 'notification';
|
|
19
|
+
export declare const CHANNEL_KEYS: readonly ChannelKey[];
|
|
20
|
+
/**
|
|
21
|
+
* Conteúdo por canal.
|
|
22
|
+
*
|
|
23
|
+
* `whatsapp_template` não é concessão à Meta — é o formato que QUALQUER
|
|
24
|
+
* provedor de WhatsApp Business exige fora da janela de 24h de conversa
|
|
25
|
+
* iniciada pelo cliente (Meta Cloud, Twilio, Zenvia, todos). Modelar isso como
|
|
26
|
+
* "texto livre" produziria código que passa em mock e é recusado em produção
|
|
27
|
+
* por toda a categoria de provider, não por um deles.
|
|
28
|
+
*/
|
|
29
|
+
export type MessageContent = {
|
|
30
|
+
kind: 'email';
|
|
31
|
+
subject: string;
|
|
32
|
+
html: string;
|
|
33
|
+
text: string;
|
|
34
|
+
}
|
|
35
|
+
/** SMS e notificação interna: texto puro, sem formatação, sem anexo. */
|
|
36
|
+
| {
|
|
37
|
+
kind: 'text';
|
|
38
|
+
body: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* WhatsApp fora da janela de sessão. `variables` é POSICIONAL por imposição
|
|
42
|
+
* do canal: o template aprovado declara `{{1}}`, `{{2}}` — os nomes vivem no
|
|
43
|
+
* produto, e a ordem é o contrato.
|
|
44
|
+
*/
|
|
45
|
+
| {
|
|
46
|
+
kind: 'whatsapp_template';
|
|
47
|
+
templateName: string;
|
|
48
|
+
language: string;
|
|
49
|
+
variables: string[];
|
|
50
|
+
};
|
|
51
|
+
/** Quais conteúdos cada canal aceita. Consultado antes do envio, não dentro do adapter. */
|
|
52
|
+
export declare const CHANNEL_ACCEPTS: Record<ChannelKey, readonly MessageContent['kind'][]>;
|
|
53
|
+
export declare function channelAccepts(channel: ChannelKey, content: MessageContent): boolean;
|
|
54
|
+
export interface OutboundMessage {
|
|
55
|
+
ctx: CommunicationContext;
|
|
56
|
+
channel: ChannelKey;
|
|
57
|
+
/**
|
|
58
|
+
* Destinatário já normalizado para o canal: E.164 em WhatsApp/SMS, endereço
|
|
59
|
+
* em e-mail, id de usuário em notificação. Normalizar é responsabilidade do
|
|
60
|
+
* motor (`contacts/phone.ts`), nunca do adapter — dois adapters normalizando
|
|
61
|
+
* por conta própria é como o mesmo cliente recebe SMS e não recebe WhatsApp.
|
|
62
|
+
*/
|
|
63
|
+
to: string;
|
|
64
|
+
content: MessageContent;
|
|
65
|
+
/** Composta pelo motor a partir do contexto. Ver `idempotency.ts`. */
|
|
66
|
+
idempotencyKey: string;
|
|
67
|
+
/** Rótulo do evento de negócio, para trilha e custo. Nunca PII. */
|
|
68
|
+
eventType: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Desfechos de entrega.
|
|
72
|
+
*
|
|
73
|
+
* Cinco, e não dois, porque cada um leva a uma decisão diferente do motor —
|
|
74
|
+
* colapsá-los em "deu certo / deu errado" faz o retry insistir no que nunca vai
|
|
75
|
+
* funcionar e desistir do que era só instabilidade.
|
|
76
|
+
*
|
|
77
|
+
* sent → o provider aceitou. NÃO é "chegou": ver `status.ts`.
|
|
78
|
+
* temporary → infraestrutura; vale tentar de novo
|
|
79
|
+
* permanent → destinatário/dado/template inválido; retry é desperdício
|
|
80
|
+
* opted_out → o destinatário recusou o canal. Não é falha e NUNCA é retry.
|
|
81
|
+
* unavailable → o canal não existe neste contexto; não conta como tentativa
|
|
82
|
+
*/
|
|
83
|
+
export type DeliveryOutcomeKind = 'sent' | 'temporary' | 'permanent' | 'opted_out' | 'unavailable';
|
|
84
|
+
export interface DeliveryOutcome {
|
|
85
|
+
kind: DeliveryOutcomeKind;
|
|
86
|
+
/** Identificador da mensagem no provider. Nunca uma credencial. */
|
|
87
|
+
providerRef?: string;
|
|
88
|
+
/** Rótulo curto e estável para métrica. snake_case. Nunca PII, nunca segredo. */
|
|
89
|
+
code?: string;
|
|
90
|
+
/** Detalhe legível. Nunca PII, nunca segredo. */
|
|
91
|
+
detail?: string;
|
|
92
|
+
}
|
|
93
|
+
export interface CommunicationChannel {
|
|
94
|
+
key: ChannelKey;
|
|
95
|
+
/**
|
|
96
|
+
* Nome do provider por trás, para a trilha ("meta_cloud", "resend"). É
|
|
97
|
+
* metadado de operação; o consumidor não ramifica por ele — se ramificasse,
|
|
98
|
+
* trocar de provider viraria mudança de regra de negócio.
|
|
99
|
+
*/
|
|
100
|
+
readonly providerName: string;
|
|
101
|
+
/**
|
|
102
|
+
* O que o provider por trás garante. **Obrigatório**, e sem `?`.
|
|
103
|
+
*
|
|
104
|
+
* A ausência de opcional é a decisão: enquanto a declaração pudesse faltar, o
|
|
105
|
+
* motor teria de assumir alguma coisa para o adapter calado — e qualquer
|
|
106
|
+
* suposição sobre garantia externa é uma suposição sobre se o cliente recebe a
|
|
107
|
+
* mesma mensagem duas vezes. Agora o compilador recusa o adapter que não
|
|
108
|
+
* declara. Ver `capabilities.ts`.
|
|
109
|
+
*/
|
|
110
|
+
readonly capabilities: ChannelCapabilities;
|
|
111
|
+
/** Falso quando ESTE contexto não tem o canal configurado. */
|
|
112
|
+
isConfigured(ctx: CommunicationContext): boolean | Promise<boolean>;
|
|
113
|
+
send(message: OutboundMessage): Promise<DeliveryOutcome>;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Canal indisponível.
|
|
117
|
+
*
|
|
118
|
+
* Deliberadamente NÃO simula entrega. Um adapter que responde `sent` sem enviar
|
|
119
|
+
* transforma a trilha em ficção: o escritório vê "cobrado" e o cliente nunca
|
|
120
|
+
* recebeu nada. Herdado da abstração da SC, que já acertou isso.
|
|
121
|
+
*/
|
|
122
|
+
export declare function unavailableChannel(key: ChannelKey, reason: string): CommunicationChannel;
|
|
123
|
+
export type ChannelRegistry = Partial<Record<ChannelKey, CommunicationChannel>>;
|
|
124
|
+
export declare function resolveChannel(registry: ChannelRegistry, key: ChannelKey): CommunicationChannel;
|
|
125
|
+
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/communication/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,cAAc,CAAC;AAEvE,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAAiD,CAAC;AAEhG;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAChE,wEAAwE;GACtE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAChC;;;;GAIG;GACD;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE/F,2FAA2F;AAC3F,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,cAAc,CAAC,MAAM,CAAC,EAAE,CAKjF,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAEpF;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,oBAAoB,CAAC;IAC1B,OAAO,EAAE,UAAU,CAAC;IACpB;;;;;OAKG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,cAAc,CAAC;IACxB,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,CAAC;AAEnG,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,UAAU,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,8DAA8D;IAC9D,YAAY,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC1D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAQxF;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAEhF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,GAAG,oBAAoB,CAE/F"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contrato canônico de canal do ecossistema — e-mail, WhatsApp, SMS e
|
|
3
|
+
* notificação interna sob a mesma interface.
|
|
4
|
+
*
|
|
5
|
+
* O ponto de desenho está no CONTEÚDO, não na interface. A abstração de canal
|
|
6
|
+
* que já existia na cobrança da SC (`collection/channel.ts`) carregava
|
|
7
|
+
* `subject` + `html` obrigatórios: um payload de e-mail com nome genérico. Um
|
|
8
|
+
* adapter de WhatsApp receberia HTML renderizado e teria de desmontá-lo de
|
|
9
|
+
* volta em texto, e um de SMS idem — o canal vazando para dentro do domínio
|
|
10
|
+
* pela porta do payload.
|
|
11
|
+
*
|
|
12
|
+
* Aqui o conteúdo é uma união discriminada, resolvida DEPOIS que o canal foi
|
|
13
|
+
* escolhido. Cada canal recebe o que sabe entregar, e o compilador recusa o
|
|
14
|
+
* resto.
|
|
15
|
+
*/
|
|
16
|
+
import { NO_PROVIDER_GUARANTEES } from './capabilities.js';
|
|
17
|
+
export const CHANNEL_KEYS = ['email', 'whatsapp', 'sms', 'notification'];
|
|
18
|
+
/** Quais conteúdos cada canal aceita. Consultado antes do envio, não dentro do adapter. */
|
|
19
|
+
export const CHANNEL_ACCEPTS = {
|
|
20
|
+
email: ['email'],
|
|
21
|
+
whatsapp: ['whatsapp_template', 'text'],
|
|
22
|
+
sms: ['text'],
|
|
23
|
+
notification: ['text'],
|
|
24
|
+
};
|
|
25
|
+
export function channelAccepts(channel, content) {
|
|
26
|
+
return CHANNEL_ACCEPTS[channel].includes(content.kind);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Canal indisponível.
|
|
30
|
+
*
|
|
31
|
+
* Deliberadamente NÃO simula entrega. Um adapter que responde `sent` sem enviar
|
|
32
|
+
* transforma a trilha em ficção: o escritório vê "cobrado" e o cliente nunca
|
|
33
|
+
* recebeu nada. Herdado da abstração da SC, que já acertou isso.
|
|
34
|
+
*/
|
|
35
|
+
export function unavailableChannel(key, reason) {
|
|
36
|
+
return {
|
|
37
|
+
key,
|
|
38
|
+
providerName: 'none',
|
|
39
|
+
capabilities: NO_PROVIDER_GUARANTEES,
|
|
40
|
+
isConfigured: () => false,
|
|
41
|
+
send: async () => ({ kind: 'unavailable', code: 'channel_not_configured', detail: reason }),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function resolveChannel(registry, key) {
|
|
45
|
+
return registry[key] ?? unavailableChannel(key, `canal ${key} não registrado`);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/communication/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAK3D,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAsBhG,2FAA2F;AAC3F,MAAM,CAAC,MAAM,eAAe,GAA0D;IACpF,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,QAAQ,EAAE,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACvC,GAAG,EAAE,CAAC,MAAM,CAAC;IACb,YAAY,EAAE,CAAC,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,OAAmB,EAAE,OAAuB;IACzE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC;AAmED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAe,EAAE,MAAc;IAChE,OAAO;QACL,GAAG;QACH,YAAY,EAAE,MAAM;QACpB,YAAY,EAAE,sBAAsB;QACpC,YAAY,EAAE,GAAG,EAAE,CAAC,KAAK;QACzB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;KAC5F,CAAC;AACJ,CAAC;AAID,MAAM,UAAU,cAAc,CAAC,QAAyB,EAAE,GAAe;IACvE,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,GAAG,EAAE,SAAS,GAAG,iBAAiB,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reserva atômica do direito de enviar.
|
|
3
|
+
*
|
|
4
|
+
* O desenho anterior era, em substância:
|
|
5
|
+
*
|
|
6
|
+
* alreadySent(key) → adapter.send() → markSent(key)
|
|
7
|
+
*
|
|
8
|
+
* Três passos, e o intervalo entre o primeiro e o terceiro é uma janela aberta:
|
|
9
|
+
* dois workers que perguntam "já enviei?" ao mesmo tempo recebem "não" os dois,
|
|
10
|
+
* e os dois chamam o provider. O cliente recebe a mesma cobrança duas vezes. A
|
|
11
|
+
* marcação posterior não conserta nada — o dinheiro do envio já saiu, e a
|
|
12
|
+
* mensagem também.
|
|
13
|
+
*
|
|
14
|
+
* Aqui a ordem é outra:
|
|
15
|
+
*
|
|
16
|
+
* claim(key) → markProviderAttempt → [só o vencedor] send() → settle
|
|
17
|
+
*
|
|
18
|
+
* `claim` é uma operação ÚNICA e atômica no armazenamento: ou ela devolve a
|
|
19
|
+
* reserva, ou devolve o motivo de não ter devolvido. Não existe estado
|
|
20
|
+
* intermediário observável entre "verifiquei" e "reservei", porque não há dois
|
|
21
|
+
* momentos. Quem não ganhou a reserva não chama o provider — nem para "tentar de
|
|
22
|
+
* novo mais rápido".
|
|
23
|
+
*
|
|
24
|
+
* **A reserva vem ANTES do efeito externo, e essa é a regra inteira.** Qualquer
|
|
25
|
+
* proteção que aconteça depois de `send` é contabilidade do que já foi feito,
|
|
26
|
+
* não controle.
|
|
27
|
+
*
|
|
28
|
+
* ## O que a H2 acrescentou, e por quê
|
|
29
|
+
*
|
|
30
|
+
* A reserva tem prazo, porque processo morre segurando reserva e uma etapa calada
|
|
31
|
+
* para sempre é pior que uma duplicata rara. Mas retomar por prazo vencido, do
|
|
32
|
+
* jeito que estava, era retomar **às cegas**: o motor não tinha como distinguir
|
|
33
|
+
*
|
|
34
|
+
* (a) o titular anterior morreu ANTES de falar com o provider — nada saiu, e
|
|
35
|
+
* reenviar é obviamente certo;
|
|
36
|
+
* (b) o titular anterior morreu DEPOIS de falar com o provider — pode ter saído,
|
|
37
|
+
* e reenviar duplica.
|
|
38
|
+
*
|
|
39
|
+
* Os dois casos chegavam aqui com a mesma cara. `markProviderAttempt` é o que os
|
|
40
|
+
* separa: uma marca durável, gravada IMEDIATAMENTE antes da chamada externa, em
|
|
41
|
+
* fronteira própria. Quem retoma uma reserva que já tinha essa marca sabe que o
|
|
42
|
+
* desfecho é **desconhecido**, não "não enviado" — e desconhecido não autoriza
|
|
43
|
+
* reenvio cego.
|
|
44
|
+
*
|
|
45
|
+
* A marca é conservadora de propósito: gravar antes de chamar significa que um
|
|
46
|
+
* processo que morre entre a marca e a chamada é classificado como "pode ter
|
|
47
|
+
* enviado" quando não enviou. Erra para o lado de calar uma mensagem, nunca para
|
|
48
|
+
* o lado de mandar duas.
|
|
49
|
+
*/
|
|
50
|
+
import type { ChannelKey } from './channel.js';
|
|
51
|
+
import type { CommunicationAuditSink, CommunicationEventKind } from './audit.js';
|
|
52
|
+
import type { CommunicationContext } from './context.js';
|
|
53
|
+
import type { SkipReason } from './policy.js';
|
|
54
|
+
import type { DeliveryStatus } from './status.js';
|
|
55
|
+
/** O que se quer reservar. A chave já vem composta pelo motor (`idempotency.ts`). */
|
|
56
|
+
export interface DispatchClaimRequest {
|
|
57
|
+
ctx: CommunicationContext;
|
|
58
|
+
channel: ChannelKey;
|
|
59
|
+
eventType: string;
|
|
60
|
+
subjectRef: string;
|
|
61
|
+
idempotencyKey: string;
|
|
62
|
+
/**
|
|
63
|
+
* Referência LÓGICA do destinatário. Nunca telefone, nunca e-mail.
|
|
64
|
+
*
|
|
65
|
+
* Vem no pedido de reserva — e não só na trilha do motor — porque a trilha do
|
|
66
|
+
* ciclo de vida do disparo passou a ser gravada AQUI, na mesma fronteira
|
|
67
|
+
* transacional da reserva. Ver a nota sobre durabilidade abaixo.
|
|
68
|
+
*/
|
|
69
|
+
recipientRef: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* A reserva concedida. Devolvida a `settle` para assentar o desfecho.
|
|
73
|
+
*
|
|
74
|
+
* `attempt` é o número da tentativa desta chave, contando a atual. Vale mais que
|
|
75
|
+
* um booleano: `attempt > 1` numa reserva concedida por EXPIRAÇÃO significa que
|
|
76
|
+
* um processo anterior morreu segurando o direito de enviar.
|
|
77
|
+
*/
|
|
78
|
+
export interface DispatchClaimHandle {
|
|
79
|
+
/** Identidade da LINHA de reserva. Estável entre tentativas da mesma chave. */
|
|
80
|
+
claimId: string;
|
|
81
|
+
/**
|
|
82
|
+
* Identidade desta GERAÇÃO da reserva — o fencing token.
|
|
83
|
+
*
|
|
84
|
+
* Muda a cada concessão, inclusive quando a reserva é retomada de um titular
|
|
85
|
+
* vencido. É o que permite a `settle` recusar o zumbi: `claimId` sozinho não
|
|
86
|
+
* serve, porque a linha é a mesma para o titular vencido e para o atual, e um
|
|
87
|
+
* `WHERE` por `claimId` deixaria o processo que ressuscita assentar por cima de
|
|
88
|
+
* quem está enviando neste instante.
|
|
89
|
+
*
|
|
90
|
+
* Prazo NÃO é fencing. Um titular vencido que acorda continua com um relógio
|
|
91
|
+
* plausível na mão; o que o desqualifica é não ter a geração corrente.
|
|
92
|
+
*/
|
|
93
|
+
claimToken: string;
|
|
94
|
+
idempotencyKey: string;
|
|
95
|
+
attempt: number;
|
|
96
|
+
/**
|
|
97
|
+
* A reserva foi tomada de um titular anterior cujo prazo venceu.
|
|
98
|
+
*
|
|
99
|
+
* Sozinho, NÃO decide nada — diz apenas que houve um titular que não assentou.
|
|
100
|
+
* A pergunta que decide é a próxima.
|
|
101
|
+
*/
|
|
102
|
+
recoveredFromExpiredClaim: boolean;
|
|
103
|
+
/**
|
|
104
|
+
* O titular anterior chegou a chamar o provider.
|
|
105
|
+
*
|
|
106
|
+
* `true` significa desfecho **UNKNOWN**, não "não enviado": a mensagem pode ter
|
|
107
|
+
* saído. É a condição que o motor consulta antes de decidir se reenvia, e é o
|
|
108
|
+
* que separa recuperação segura de recuperação cega.
|
|
109
|
+
*/
|
|
110
|
+
previousAttemptReachedProvider: boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Há quanto tempo (ms) foi a PRIMEIRA chamada externa desta chave, se houve.
|
|
113
|
+
*
|
|
114
|
+
* A janela de idempotência do provider conta a partir dela, não da tentativa
|
|
115
|
+
* atual: uma chave que o provider já esqueceu não protege mais nada.
|
|
116
|
+
*
|
|
117
|
+
* Idade, e não instante, porque quem mede é quem guarda: o store SQL usa o
|
|
118
|
+
* relógio do banco, o de memória usa o dele. Devolver o instante obrigaria o
|
|
119
|
+
* motor a compará-lo com o relógio do PROCESSO, e dois relógios que não
|
|
120
|
+
* concordam decidem errado sobre reenviar ou não.
|
|
121
|
+
*/
|
|
122
|
+
providerFirstAttemptAgeMs: number | null;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Por que a reserva não foi concedida.
|
|
126
|
+
*
|
|
127
|
+
* Cada motivo leva a uma leitura operacional diferente, e por isso nenhum deles
|
|
128
|
+
* é "não deu": `already_sent` é o sistema funcionando; `in_flight` é
|
|
129
|
+
* concorrência sendo absorvida; `permanently_failed` e `unknown_outcome` são
|
|
130
|
+
* coisas que precisam de humano — e por motivos opostos.
|
|
131
|
+
*/
|
|
132
|
+
export type ClaimRefusal = 'already_sent' | 'in_flight' | 'permanently_failed'
|
|
133
|
+
/**
|
|
134
|
+
* A chave está parada em desfecho DESCONHECIDO: alguém chamou o provider e
|
|
135
|
+
* ninguém sabe o que aconteceu.
|
|
136
|
+
*
|
|
137
|
+
* Não é falha (pode ter dado certo) e não é sucesso (pode não ter saído). Fica
|
|
138
|
+
* travada de propósito: destravar sozinha seria escolher, no escuro, entre
|
|
139
|
+
* calar um aviso e mandar dois. Sai daqui por `resolveUnknownOutcome`.
|
|
140
|
+
*/
|
|
141
|
+
| 'unknown_outcome';
|
|
142
|
+
export type ClaimResult = {
|
|
143
|
+
granted: true;
|
|
144
|
+
claim: DispatchClaimHandle;
|
|
145
|
+
} | {
|
|
146
|
+
granted: false;
|
|
147
|
+
reason: ClaimRefusal;
|
|
148
|
+
detail?: string;
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Desfecho a assentar.
|
|
152
|
+
*
|
|
153
|
+
* `released` é o caso que não existia no desenho antigo e que a reserva torna
|
|
154
|
+
* obrigatório: reservei e NÃO enviei (dry-run, conteúdo recusado na borda). Sem
|
|
155
|
+
* ele a chave ficaria presa até o prazo vencer, e o ensaio calaria a etapa real.
|
|
156
|
+
*
|
|
157
|
+
* `unknown` é o da H2: reservei, descobri que o titular anterior pode ter enviado
|
|
158
|
+
* e NÃO tenho como garantir que um reenvio não duplica. Assentar como falha
|
|
159
|
+
* devolveria a chave e a próxima rodada duplicaria; assentar como enviada
|
|
160
|
+
* afirmaria uma entrega que ninguém viu.
|
|
161
|
+
*/
|
|
162
|
+
export type ClaimSettlement = {
|
|
163
|
+
kind: 'sent';
|
|
164
|
+
providerRef?: string;
|
|
165
|
+
} | {
|
|
166
|
+
kind: 'failed';
|
|
167
|
+
permanent: boolean;
|
|
168
|
+
code?: string;
|
|
169
|
+
detail?: string;
|
|
170
|
+
} | {
|
|
171
|
+
kind: 'released';
|
|
172
|
+
reason: string;
|
|
173
|
+
} | {
|
|
174
|
+
kind: 'unknown';
|
|
175
|
+
code?: string;
|
|
176
|
+
detail?: string;
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* O evento de trilha que acompanha a transição.
|
|
180
|
+
*
|
|
181
|
+
* Vai JUNTO com o `settle`, na mesma gravação, e é isso que o torna durável.
|
|
182
|
+
* Ver a nota sobre fronteira transacional abaixo.
|
|
183
|
+
*/
|
|
184
|
+
export interface DispatchLifecycleEvent {
|
|
185
|
+
kind: CommunicationEventKind;
|
|
186
|
+
providerRef?: string | null;
|
|
187
|
+
skipReason?: SkipReason | null;
|
|
188
|
+
status?: DeliveryStatus | null;
|
|
189
|
+
code?: string | null;
|
|
190
|
+
detail?: string | null;
|
|
191
|
+
}
|
|
192
|
+
/** Como um desfecho desconhecido foi resolvido por quem investigou. */
|
|
193
|
+
export type UnknownResolution = 'sent' | 'not_sent';
|
|
194
|
+
/**
|
|
195
|
+
* Veredicto do FENCING PRÉ-PROVIDER: quem chama ainda é o titular do direito de
|
|
196
|
+
* enviar, agora, no armazenamento?
|
|
197
|
+
*
|
|
198
|
+
* ## Por que isto existe
|
|
199
|
+
*
|
|
200
|
+
* `markProviderAttempt` devolvia `void`. A trava por geração estava no `WHERE` do
|
|
201
|
+
* `UPDATE` — e funcionava: a linha do zumbi não era atualizada. Mas o motor não
|
|
202
|
+
* tinha como saber disso. Gravava (ou não gravava) a marca e seguia direto para
|
|
203
|
+
* `adapter.send()`. O resultado é o que a terceira certificação encontrou:
|
|
204
|
+
*
|
|
205
|
+
* A perde a reserva por prazo → B a retoma e envia
|
|
206
|
+
* A acorda, "marca" a tentativa (nenhuma linha muda) → A envia também
|
|
207
|
+
*
|
|
208
|
+
* Duas chamadas ao provider para a mesma intenção, com a trava de fencing
|
|
209
|
+
* presente, correta e **muda**. Uma trava cujo resultado o chamador ignora não é
|
|
210
|
+
* trava: é um `UPDATE` que às vezes não faz nada.
|
|
211
|
+
*
|
|
212
|
+
* Por isso o retorno é uma união DISCRIMINADA, e não um booleano. `held` e `lost`
|
|
213
|
+
* já bastariam para abortar, mas colapsariam duas coisas que quem opera precisa
|
|
214
|
+
* distinguir: "outro worker está com a reserva" e "esta chave já foi assentada".
|
|
215
|
+
* A primeira é concorrência normal; a segunda é o motor sendo chamado sobre um
|
|
216
|
+
* disparo que acabou.
|
|
217
|
+
*
|
|
218
|
+
* ## O que NÃO está aqui, e por quê
|
|
219
|
+
*
|
|
220
|
+
* Não há membro `unknown`. Falha de GRAVAÇÃO da marca (banco fora, timeout) não
|
|
221
|
+
* é desfecho incerto: nada foi enviado ainda, porque a marca vem antes da
|
|
222
|
+
* chamada externa. Esse caso LANÇA — e é deliberado. Ver a nota em `engine.ts`
|
|
223
|
+
* sobre o `markProviderAttempt` ficar fora do `try` do adapter: deixar a exceção
|
|
224
|
+
* subir faz a reserva simplesmente expirar, e a retomada seguinte é segura
|
|
225
|
+
* justamente porque não existe marca nenhuma. Devolver `unknown` aqui travaria a
|
|
226
|
+
* chave por uma falha de banco num envio que nem começou.
|
|
227
|
+
*/
|
|
228
|
+
export type ProviderAttemptFence =
|
|
229
|
+
/** A geração corrente é a de quem chamou. Autorizado a chamar o provider. */
|
|
230
|
+
{
|
|
231
|
+
authority: 'held';
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* A reserva mudou de mãos (prazo vencido e retomada por outro), ou a linha não
|
|
235
|
+
* existe mais. **Quem recebe isto não chama o provider.**
|
|
236
|
+
*/
|
|
237
|
+
| {
|
|
238
|
+
authority: 'lost';
|
|
239
|
+
detail: string;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* A chave já está assentada — `sent`, `failed_permanent`, `unknown_outcome`.
|
|
243
|
+
*
|
|
244
|
+
* Recorte próprio de `lost` porque a ação de quem investiga é outra: em `lost`
|
|
245
|
+
* há um titular novo trabalhando agora; aqui não há titular nenhum, e o disparo
|
|
246
|
+
* terminou.
|
|
247
|
+
*/
|
|
248
|
+
| {
|
|
249
|
+
authority: 'already_final';
|
|
250
|
+
state: DispatchKeyState;
|
|
251
|
+
detail: string;
|
|
252
|
+
};
|
|
253
|
+
/** Estado de uma chave, para LEITURA pura. Nunca reserva nada. */
|
|
254
|
+
export type DispatchKeyState = 'none' | 'in_flight' | 'sent' | 'failed_retryable' | 'failed_permanent' | 'unknown_outcome';
|
|
255
|
+
/**
|
|
256
|
+
* Porta de reserva. Implementada pelo produto, sobre o armazenamento dele.
|
|
257
|
+
*
|
|
258
|
+
* O motor não sabe se é Postgres, Redis ou outra coisa; sabe que `claim` é
|
|
259
|
+
* atômico em relação a outros `claim` da mesma chave — **inclusive entre
|
|
260
|
+
* processos diferentes**. Uma implementação que só coordene dentro de um
|
|
261
|
+
* processo satisfaz a interface e não satisfaz o requisito: ver a nota em
|
|
262
|
+
* `createInMemoryDispatchClaimStore`.
|
|
263
|
+
*
|
|
264
|
+
* ## A trilha do ciclo de vida mora AQUI
|
|
265
|
+
*
|
|
266
|
+
* `dispatch_claimed`, `dispatch_sent`, `dispatch_failed` são gravados pelo store,
|
|
267
|
+
* na MESMA fronteira transacional da reserva — não pelo `audit` do motor.
|
|
268
|
+
*
|
|
269
|
+
* A razão é um defeito concreto que a certificação achou. O `audit` do motor
|
|
270
|
+
* escreve na transação de NEGÓCIO de quem chamou (a régua de cobrança roda o
|
|
271
|
+
* ciclo inteiro numa transação longa). A reserva, ao contrário, commita em
|
|
272
|
+
* transação própria e curta, porque precisa ficar visível a outros workers antes
|
|
273
|
+
* do fim do ciclo. Se a transação longa fizesse rollback DEPOIS de a mensagem
|
|
274
|
+
* sair, o resultado era:
|
|
275
|
+
*
|
|
276
|
+
* communication_dispatch.status = 'sent' (sobreviveu — a mensagem saiu)
|
|
277
|
+
* communication_event.dispatch_sent (sumiu — a narrativa foi desfeita)
|
|
278
|
+
*
|
|
279
|
+
* Um disparo enviado sem nenhuma linha explicando que foi enviado. Juntando a
|
|
280
|
+
* gravação do evento à gravação da reserva, as duas caem ou sobrevivem juntas —
|
|
281
|
+
* uma escrita, não duas. Não é outbox nem dual-write com compensação: é a mesma
|
|
282
|
+
* transação, que é o padrão mais simples que satisfaz a exigência.
|
|
283
|
+
*
|
|
284
|
+
* O que continua no `audit` do motor: `intent_created` e os pulos ANTERIORES à
|
|
285
|
+
* reserva. Esses descrevem decisões sem efeito externo nenhum — se a transação de
|
|
286
|
+
* negócio cair, nada saiu, e a narrativa não deve mesmo sobreviver.
|
|
287
|
+
*/
|
|
288
|
+
export interface DispatchClaimStore {
|
|
289
|
+
/** Reserva e grava `dispatch_claimed` na mesma fronteira. */
|
|
290
|
+
claim(req: DispatchClaimRequest): Promise<ClaimResult>;
|
|
291
|
+
/**
|
|
292
|
+
* Marca, DURAVELMENTE, que a chamada externa vai acontecer agora — **e devolve
|
|
293
|
+
* se quem pediu ainda tem autoridade para fazê-la.**
|
|
294
|
+
*
|
|
295
|
+
* Chamada imediatamente antes de `adapter.send`, e não junto com o `claim`: se
|
|
296
|
+
* a marca viesse no `claim`, todo processo que morresse entre reservar e
|
|
297
|
+
* enviar travaria a chave num "desconhecido" que não existe.
|
|
298
|
+
*
|
|
299
|
+
* É a ÚLTIMA fronteira persistente antes do efeito externo, e por isso as duas
|
|
300
|
+
* coisas — marcar e verificar autoridade — são a MESMA operação, atômica. Um
|
|
301
|
+
* `peek` seguido de `send` reabriria a janela TOCTOU que a reserva existe para
|
|
302
|
+
* fechar: entre ler o estado e chamar o provider, a reserva pode trocar de
|
|
303
|
+
* mãos. Aqui não pode: ou o `UPDATE` casa a geração corrente e a marca fica
|
|
304
|
+
* gravada, ou ele não casa nada e o veredicto é `lost`.
|
|
305
|
+
*
|
|
306
|
+
* Implementações NÃO devem devolver `held` quando nenhuma linha foi atualizada.
|
|
307
|
+
* É esse "sucesso genérico" que a terceira certificação encontrou — ver
|
|
308
|
+
* `ProviderAttemptFence`.
|
|
309
|
+
*/
|
|
310
|
+
markProviderAttempt(claim: DispatchClaimHandle): Promise<ProviderAttemptFence>;
|
|
311
|
+
/** Assenta o desfecho e grava o evento correspondente na mesma gravação. */
|
|
312
|
+
settle(claim: DispatchClaimHandle, outcome: ClaimSettlement, event: DispatchLifecycleEvent): Promise<void>;
|
|
313
|
+
/**
|
|
314
|
+
* Estado atual da chave, sem reservar.
|
|
315
|
+
*
|
|
316
|
+
* Existe para o dry-run: o ensaio precisa relatar "isto já saiu" com a mesma
|
|
317
|
+
* verdade da execução, e não pode fazê-lo tomando uma reserva — um ensaio que
|
|
318
|
+
* escreve não é ensaio.
|
|
319
|
+
*/
|
|
320
|
+
peek(idempotencyKey: string): Promise<DispatchKeyState>;
|
|
321
|
+
/**
|
|
322
|
+
* Saída do estado desconhecido, por decisão de quem investigou.
|
|
323
|
+
*
|
|
324
|
+
* `sent` encerra a chave (a mensagem saiu; não reenviar). `not_sent` a devolve
|
|
325
|
+
* para retentável (não saiu; a próxima rodada pode enviar). É deliberadamente
|
|
326
|
+
* uma operação EXPLÍCITA: nenhum caminho automático adivinha o que aconteceu no
|
|
327
|
+
* provider, porque adivinhar aqui é escolher entre calar um aviso e cobrar duas
|
|
328
|
+
* vezes.
|
|
329
|
+
*/
|
|
330
|
+
resolveUnknownOutcome(idempotencyKey: string, resolution: UnknownResolution, detail?: string): Promise<void>;
|
|
331
|
+
}
|
|
332
|
+
/** Prazo da reserva. Ver `createInMemoryDispatchClaimStore` para o raciocínio. */
|
|
333
|
+
export declare const DEFAULT_CLAIM_TTL_MS: number;
|
|
334
|
+
export interface InMemoryClaimStoreOptions {
|
|
335
|
+
ttlMs?: number;
|
|
336
|
+
now?: () => number;
|
|
337
|
+
/**
|
|
338
|
+
* Destino da trilha de ciclo de vida.
|
|
339
|
+
*
|
|
340
|
+
* Existe para que a implementação em memória tenha a MESMA fronteira que a
|
|
341
|
+
* SQL: lá o evento cai na transação da reserva, aqui ele cai no sink que o
|
|
342
|
+
* store recebeu — em nenhum dos dois casos ele depende da transação de negócio
|
|
343
|
+
* de quem chamou. Um store de teste que gravasse a trilha por outro caminho
|
|
344
|
+
* mediria uma propriedade diferente da que produção tem.
|
|
345
|
+
*/
|
|
346
|
+
audit?: CommunicationAuditSink;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Reserva em memória — **um processo só**.
|
|
350
|
+
*
|
|
351
|
+
* Serve a testes e a consumidores que rodam em instância única. Não serve a
|
|
352
|
+
* produção com mais de um worker, e a limitação está aqui em vez de num
|
|
353
|
+
* comentário do consumidor porque é o consumidor que erra: "por enquanto é uma
|
|
354
|
+
* instância" é verdade até o dia do primeiro redeploy com sobreposição.
|
|
355
|
+
*
|
|
356
|
+
* É atômica dentro do processo porque a decisão inteira acontece sem `await` no
|
|
357
|
+
* meio — em JavaScript isso basta para que dois `dispatch` concorrentes não se
|
|
358
|
+
* intercalem no ponto de decisão. Essa propriedade é o que o teste de
|
|
359
|
+
* concorrência in-process exercita; a prova de múltiplos processos é do store
|
|
360
|
+
* SQL.
|
|
361
|
+
*
|
|
362
|
+
* O prazo (`ttlMs`) existe pela mesma razão do store SQL: processo que morre
|
|
363
|
+
* segurando reserva não pode calar a etapa para sempre. Dez minutos é muito
|
|
364
|
+
* maior que qualquer timeout de provider (o mais longo aqui é 10 s) e muito
|
|
365
|
+
* menor que o intervalo entre ciclos da régua (24 h).
|
|
366
|
+
*/
|
|
367
|
+
export declare function createInMemoryDispatchClaimStore(options?: InMemoryClaimStoreOptions): DispatchClaimStore;
|
|
368
|
+
//# sourceMappingURL=claim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../src/communication/claim.ts"],"names":[],"mappings":"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"}
|