@baruk/core 0.4.2 → 0.6.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/.baruk-provenance.json +4 -4
- package/CHANGELOG.md +42 -0
- package/dist/audit/repository.d.ts +33 -1
- package/dist/audit/repository.d.ts.map +1 -1
- package/dist/audit/repository.js +41 -7
- package/dist/audit/repository.js.map +1 -1
- package/dist/auth/service.d.ts +21 -0
- package/dist/auth/service.d.ts.map +1 -1
- package/dist/auth/service.js +46 -1
- package/dist/auth/service.js.map +1 -1
- package/dist/billing/ar-repository.d.ts +41 -1
- package/dist/billing/ar-repository.d.ts.map +1 -1
- package/dist/billing/ar-repository.js +82 -6
- package/dist/billing/ar-repository.js.map +1 -1
- package/dist/billing/provider-account.d.ts +38 -0
- package/dist/billing/provider-account.d.ts.map +1 -1
- package/dist/billing/provider-account.js +58 -2
- package/dist/billing/provider-account.js.map +1 -1
- package/dist/billing/repository.d.ts +44 -0
- package/dist/billing/repository.d.ts.map +1 -1
- package/dist/billing/repository.js +49 -5
- package/dist/billing/repository.js.map +1 -1
- package/dist/cjs/audit/repository.js +41 -7
- package/dist/cjs/audit/repository.js.map +1 -1
- package/dist/cjs/auth/service.js +46 -1
- package/dist/cjs/auth/service.js.map +1 -1
- package/dist/cjs/billing/ar-repository.js +82 -6
- package/dist/cjs/billing/ar-repository.js.map +1 -1
- package/dist/cjs/billing/provider-account.js +60 -1
- package/dist/cjs/billing/provider-account.js.map +1 -1
- package/dist/cjs/billing/repository.js +51 -5
- package/dist/cjs/billing/repository.js.map +1 -1
- package/dist/cjs/clients/ibge.js +117 -0
- package/dist/cjs/clients/ibge.js.map +1 -0
- package/dist/cjs/clients/registry/http.js +157 -0
- package/dist/cjs/clients/registry/http.js.map +1 -0
- package/dist/cjs/clients/registry/ibge-municipios.js +28 -0
- package/dist/cjs/clients/registry/ibge-municipios.js.map +1 -0
- package/dist/cjs/clients/registry/ibge.js +63 -0
- package/dist/cjs/clients/registry/ibge.js.map +1 -0
- package/dist/cjs/clients/registry/lookup.js +191 -0
- package/dist/cjs/clients/registry/lookup.js.map +1 -0
- package/dist/cjs/clients/registry/provider.js +34 -0
- package/dist/cjs/clients/registry/provider.js.map +1 -0
- package/dist/cjs/clients/registry/resolve.js +47 -0
- package/dist/cjs/clients/registry/resolve.js.map +1 -0
- package/dist/cjs/clients/registry/serpro.js +149 -0
- package/dist/cjs/clients/registry/serpro.js.map +1 -0
- package/dist/cjs/clients/registry/service.js +230 -0
- package/dist/cjs/clients/registry/service.js.map +1 -0
- package/dist/cjs/clients/registry/synthetic.js +165 -0
- package/dist/cjs/clients/registry/synthetic.js.map +1 -0
- package/dist/cjs/clients/repository.js +190 -9
- package/dist/cjs/clients/repository.js.map +1 -1
- package/dist/cjs/collection/branding.js +190 -0
- package/dist/cjs/collection/branding.js.map +1 -1
- package/dist/cjs/collection/clearance-store.js +74 -0
- package/dist/cjs/collection/clearance-store.js.map +1 -0
- package/dist/cjs/collection/communication-runtime.js +65 -2
- package/dist/cjs/collection/communication-runtime.js.map +1 -1
- package/dist/cjs/collection/engine.js +20 -0
- package/dist/cjs/collection/engine.js.map +1 -1
- package/dist/cjs/collection/policy.js +29 -1
- package/dist/cjs/collection/policy.js.map +1 -1
- package/dist/cjs/communication/clearance.js +18 -0
- package/dist/cjs/communication/clearance.js.map +1 -0
- package/dist/cjs/communication/dry-run-scenario.js +5 -0
- package/dist/cjs/communication/dry-run-scenario.js.map +1 -1
- package/dist/cjs/communication/engine.js +12 -0
- package/dist/cjs/communication/engine.js.map +1 -1
- package/dist/cjs/communication/policy.js.map +1 -1
- package/dist/cjs/competence/business-days.js +155 -0
- package/dist/cjs/competence/business-days.js.map +1 -0
- package/dist/cjs/competence/catalog-validation.js +174 -0
- package/dist/cjs/competence/catalog-validation.js.map +1 -0
- package/dist/cjs/competence/obligation-preview.js +190 -0
- package/dist/cjs/competence/obligation-preview.js.map +1 -0
- package/dist/cjs/competence/repository.js +330 -17
- package/dist/cjs/competence/repository.js.map +1 -1
- package/dist/cjs/dashboard/pilot-panel.js +90 -0
- package/dist/cjs/dashboard/pilot-panel.js.map +1 -0
- package/dist/cjs/dashboard/repository.js +11 -1
- package/dist/cjs/dashboard/repository.js.map +1 -1
- package/dist/cjs/db/client.js +17 -11
- package/dist/cjs/db/client.js.map +1 -1
- package/dist/cjs/db/provision-e2e-identity.js +116 -0
- package/dist/cjs/db/provision-e2e-identity.js.map +1 -0
- package/dist/cjs/fiscal/applicability.js +164 -0
- package/dist/cjs/fiscal/applicability.js.map +1 -0
- package/dist/cjs/fiscal/collection/authorization.js +186 -0
- package/dist/cjs/fiscal/collection/authorization.js.map +1 -0
- package/dist/cjs/fiscal/collection/competence.js +97 -0
- package/dist/cjs/fiscal/collection/competence.js.map +1 -0
- package/dist/cjs/fiscal/collection/first-contact.js +204 -0
- package/dist/cjs/fiscal/collection/first-contact.js.map +1 -0
- package/dist/cjs/fiscal/collection/plan.js +122 -0
- package/dist/cjs/fiscal/collection/plan.js.map +1 -0
- package/dist/cjs/fiscal/conditions.js +198 -0
- package/dist/cjs/fiscal/conditions.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js +390 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js +108 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js +220 -0
- package/dist/cjs/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/cjs/fiscal/coverage/model.js +137 -0
- package/dist/cjs/fiscal/coverage/model.js.map +1 -0
- package/dist/cjs/fiscal/coverage/requests.js +99 -0
- package/dist/cjs/fiscal/coverage/requests.js.map +1 -0
- package/dist/cjs/fiscal/credentials/inspect.js +182 -0
- package/dist/cjs/fiscal/credentials/inspect.js.map +1 -0
- package/dist/cjs/fiscal/credentials/material.js +168 -0
- package/dist/cjs/fiscal/credentials/material.js.map +1 -0
- package/dist/cjs/fiscal/credentials/onboarding.js +266 -0
- package/dist/cjs/fiscal/credentials/onboarding.js.map +1 -0
- package/dist/cjs/fiscal/credentials/readiness.js +190 -0
- package/dist/cjs/fiscal/credentials/readiness.js.map +1 -0
- package/dist/cjs/fiscal/eligibility.js +199 -0
- package/dist/cjs/fiscal/eligibility.js.map +1 -0
- package/dist/cjs/fiscal/enrollment.js +134 -0
- package/dist/cjs/fiscal/enrollment.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js +128 -0
- package/dist/cjs/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js +229 -0
- package/dist/cjs/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/direction.js +36 -0
- package/dist/cjs/fiscal/ingestion/direction.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js +228 -0
- package/dist/cjs/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js +704 -0
- package/dist/cjs/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/provider.js +51 -0
- package/dist/cjs/fiscal/ingestion/provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/repository.js +132 -0
- package/dist/cjs/fiscal/ingestion/repository.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js +103 -0
- package/dist/cjs/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js +13 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js +61 -0
- package/dist/cjs/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js +121 -0
- package/dist/cjs/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/cjs/fiscal/repository.js +470 -0
- package/dist/cjs/fiscal/repository.js.map +1 -0
- package/dist/cjs/fiscal/sync/circuit.js +124 -0
- package/dist/cjs/fiscal/sync/circuit.js.map +1 -0
- package/dist/cjs/fiscal/sync/intervention.js +140 -0
- package/dist/cjs/fiscal/sync/intervention.js.map +1 -0
- package/dist/cjs/fiscal/sync/lease.js +146 -0
- package/dist/cjs/fiscal/sync/lease.js.map +1 -0
- package/dist/cjs/fiscal/sync/observability.js +244 -0
- package/dist/cjs/fiscal/sync/observability.js.map +1 -0
- package/dist/cjs/fiscal/sync/orchestrator.js +490 -0
- package/dist/cjs/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/cjs/fiscal/sync/policy.js +143 -0
- package/dist/cjs/fiscal/sync/policy.js.map +1 -0
- package/dist/cjs/fiscal/sync/reprocess.js +241 -0
- package/dist/cjs/fiscal/sync/reprocess.js.map +1 -0
- package/dist/cjs/fiscal/sync/retry.js +183 -0
- package/dist/cjs/fiscal/sync/retry.js.map +1 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js +123 -0
- package/dist/cjs/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/cjs/fiscal/transport/https.js +309 -0
- package/dist/cjs/fiscal/transport/https.js.map +1 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js +380 -0
- package/dist/cjs/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/cjs/fiscal/transport/types.js +93 -0
- package/dist/cjs/fiscal/transport/types.js.map +1 -0
- package/dist/cjs/import/br-documents.js +85 -0
- package/dist/cjs/import/br-documents.js.map +1 -0
- package/dist/cjs/import/clients-import.js +347 -40
- package/dist/cjs/import/clients-import.js.map +1 -1
- package/dist/cjs/index.js +461 -73
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legal/documents.js +164 -19
- package/dist/cjs/legal/documents.js.map +1 -1
- package/dist/cjs/legal/index.js +3 -1
- package/dist/cjs/legal/index.js.map +1 -1
- package/dist/cjs/legal/types.js.map +1 -1
- package/dist/cjs/onboarding/persistence.js +4 -4
- package/dist/cjs/onboarding/persistence.js.map +1 -1
- package/dist/cjs/pilot/go-live-checklist.js +212 -0
- package/dist/cjs/pilot/go-live-checklist.js.map +1 -0
- package/dist/cjs/pilot/milestone.js +79 -0
- package/dist/cjs/pilot/milestone.js.map +1 -0
- package/dist/cjs/platform/capabilities.js +173 -0
- package/dist/cjs/platform/capabilities.js.map +1 -0
- package/dist/cjs/platform/job-contract.js +411 -0
- package/dist/cjs/platform/job-contract.js.map +1 -0
- package/dist/cjs/rbac/catalog.js +110 -0
- package/dist/cjs/rbac/catalog.js.map +1 -1
- package/dist/cjs/subscription-billing/index.js +9 -1
- package/dist/cjs/subscription-billing/index.js.map +1 -1
- package/dist/cjs/subscription-billing/platform-exemption.js +121 -0
- package/dist/cjs/subscription-billing/platform-exemption.js.map +1 -0
- package/dist/cjs/subscription-billing/service.js +246 -78
- package/dist/cjs/subscription-billing/service.js.map +1 -1
- package/dist/cjs/tenancy/features.js +131 -0
- package/dist/cjs/tenancy/features.js.map +1 -0
- package/dist/cjs/tenancy/settings.js +224 -0
- package/dist/cjs/tenancy/settings.js.map +1 -0
- package/dist/cjs/users/repository.js +24 -1
- package/dist/cjs/users/repository.js.map +1 -1
- package/dist/cjs/vault/repository.js +92 -5
- package/dist/cjs/vault/repository.js.map +1 -1
- package/dist/clients/ibge.d.ts +17 -0
- package/dist/clients/ibge.d.ts.map +1 -0
- package/dist/clients/ibge.js +112 -0
- package/dist/clients/ibge.js.map +1 -0
- package/dist/clients/registry/http.d.ts +61 -0
- package/dist/clients/registry/http.d.ts.map +1 -0
- package/dist/clients/registry/http.js +151 -0
- package/dist/clients/registry/http.js.map +1 -0
- package/dist/clients/registry/ibge-municipios.d.ts +25 -0
- package/dist/clients/registry/ibge-municipios.d.ts.map +1 -0
- package/dist/clients/registry/ibge-municipios.js +25 -0
- package/dist/clients/registry/ibge-municipios.js.map +1 -0
- package/dist/clients/registry/ibge.d.ts +62 -0
- package/dist/clients/registry/ibge.d.ts.map +1 -0
- package/dist/clients/registry/ibge.js +57 -0
- package/dist/clients/registry/ibge.js.map +1 -0
- package/dist/clients/registry/lookup.d.ts +94 -0
- package/dist/clients/registry/lookup.d.ts.map +1 -0
- package/dist/clients/registry/lookup.js +184 -0
- package/dist/clients/registry/lookup.js.map +1 -0
- package/dist/clients/registry/provider.d.ts +124 -0
- package/dist/clients/registry/provider.d.ts.map +1 -0
- package/dist/clients/registry/provider.js +39 -0
- package/dist/clients/registry/provider.js.map +1 -0
- package/dist/clients/registry/resolve.d.ts +36 -0
- package/dist/clients/registry/resolve.d.ts.map +1 -0
- package/dist/clients/registry/resolve.js +44 -0
- package/dist/clients/registry/resolve.js.map +1 -0
- package/dist/clients/registry/serpro.d.ts +57 -0
- package/dist/clients/registry/serpro.d.ts.map +1 -0
- package/dist/clients/registry/serpro.js +143 -0
- package/dist/clients/registry/serpro.js.map +1 -0
- package/dist/clients/registry/service.d.ts +59 -0
- package/dist/clients/registry/service.d.ts.map +1 -0
- package/dist/clients/registry/service.js +225 -0
- package/dist/clients/registry/service.js.map +1 -0
- package/dist/clients/registry/synthetic.d.ts +30 -0
- package/dist/clients/registry/synthetic.d.ts.map +1 -0
- package/dist/clients/registry/synthetic.js +161 -0
- package/dist/clients/registry/synthetic.js.map +1 -0
- package/dist/clients/repository.d.ts +158 -0
- package/dist/clients/repository.d.ts.map +1 -1
- package/dist/clients/repository.js +186 -9
- package/dist/clients/repository.js.map +1 -1
- package/dist/collection/branding.d.ts +65 -0
- package/dist/collection/branding.d.ts.map +1 -1
- package/dist/collection/branding.js +186 -0
- package/dist/collection/branding.js.map +1 -1
- package/dist/collection/clearance-store.d.ts +39 -0
- package/dist/collection/clearance-store.d.ts.map +1 -0
- package/dist/collection/clearance-store.js +69 -0
- package/dist/collection/clearance-store.js.map +1 -0
- package/dist/collection/communication-runtime.d.ts +37 -0
- package/dist/collection/communication-runtime.d.ts.map +1 -1
- package/dist/collection/communication-runtime.js +63 -1
- package/dist/collection/communication-runtime.js.map +1 -1
- package/dist/collection/engine.d.ts +23 -0
- package/dist/collection/engine.d.ts.map +1 -1
- package/dist/collection/engine.js +20 -0
- package/dist/collection/engine.js.map +1 -1
- package/dist/collection/policy.d.ts +25 -0
- package/dist/collection/policy.d.ts.map +1 -1
- package/dist/collection/policy.js +27 -0
- package/dist/collection/policy.js.map +1 -1
- package/dist/communication/clearance.d.ts +53 -0
- package/dist/communication/clearance.d.ts.map +1 -0
- package/dist/communication/clearance.js +15 -0
- package/dist/communication/clearance.js.map +1 -0
- package/dist/communication/dry-run-scenario.d.ts.map +1 -1
- package/dist/communication/dry-run-scenario.js +5 -0
- package/dist/communication/dry-run-scenario.js.map +1 -1
- package/dist/communication/engine.d.ts +10 -0
- package/dist/communication/engine.d.ts.map +1 -1
- package/dist/communication/engine.js +12 -0
- package/dist/communication/engine.js.map +1 -1
- package/dist/communication/policy.d.ts +16 -0
- package/dist/communication/policy.d.ts.map +1 -1
- package/dist/communication/policy.js.map +1 -1
- package/dist/competence/business-days.d.ts +51 -0
- package/dist/competence/business-days.d.ts.map +1 -0
- package/dist/competence/business-days.js +145 -0
- package/dist/competence/business-days.js.map +1 -0
- package/dist/competence/catalog-validation.d.ts +86 -0
- package/dist/competence/catalog-validation.d.ts.map +1 -0
- package/dist/competence/catalog-validation.js +168 -0
- package/dist/competence/catalog-validation.js.map +1 -0
- package/dist/competence/obligation-preview.d.ts +103 -0
- package/dist/competence/obligation-preview.d.ts.map +1 -0
- package/dist/competence/obligation-preview.js +184 -0
- package/dist/competence/obligation-preview.js.map +1 -0
- package/dist/competence/repository.d.ts +139 -1
- package/dist/competence/repository.d.ts.map +1 -1
- package/dist/competence/repository.js +325 -17
- package/dist/competence/repository.js.map +1 -1
- package/dist/dashboard/pilot-panel.d.ts +100 -0
- package/dist/dashboard/pilot-panel.d.ts.map +1 -0
- package/dist/dashboard/pilot-panel.js +87 -0
- package/dist/dashboard/pilot-panel.js.map +1 -0
- package/dist/dashboard/repository.d.ts.map +1 -1
- package/dist/dashboard/repository.js +11 -1
- package/dist/dashboard/repository.js.map +1 -1
- package/dist/db/client.d.ts +45 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +16 -11
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrate.d.ts +36 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +199 -32
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/provision-e2e-identity.d.ts +2 -0
- package/dist/db/provision-e2e-identity.d.ts.map +1 -0
- package/dist/db/provision-e2e-identity.js +114 -0
- package/dist/db/provision-e2e-identity.js.map +1 -0
- package/dist/fiscal/applicability.d.ts +73 -0
- package/dist/fiscal/applicability.d.ts.map +1 -0
- package/dist/fiscal/applicability.js +160 -0
- package/dist/fiscal/applicability.js.map +1 -0
- package/dist/fiscal/collection/authorization.d.ts +152 -0
- package/dist/fiscal/collection/authorization.d.ts.map +1 -0
- package/dist/fiscal/collection/authorization.js +178 -0
- package/dist/fiscal/collection/authorization.js.map +1 -0
- package/dist/fiscal/collection/competence.d.ts +66 -0
- package/dist/fiscal/collection/competence.d.ts.map +1 -0
- package/dist/fiscal/collection/competence.js +90 -0
- package/dist/fiscal/collection/competence.js.map +1 -0
- package/dist/fiscal/collection/first-contact.d.ts +103 -0
- package/dist/fiscal/collection/first-contact.d.ts.map +1 -0
- package/dist/fiscal/collection/first-contact.js +201 -0
- package/dist/fiscal/collection/first-contact.js.map +1 -0
- package/dist/fiscal/collection/plan.d.ts +74 -0
- package/dist/fiscal/collection/plan.d.ts.map +1 -0
- package/dist/fiscal/collection/plan.js +119 -0
- package/dist/fiscal/collection/plan.js.map +1 -0
- package/dist/fiscal/conditions.d.ts +99 -0
- package/dist/fiscal/conditions.d.ts.map +1 -0
- package/dist/fiscal/conditions.js +190 -0
- package/dist/fiscal/conditions.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts +315 -0
- package/dist/fiscal/contracts/nfse-adn-contract.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js +386 -0
- package/dist/fiscal/contracts/nfse-adn-contract.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts +13 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js +103 -0
- package/dist/fiscal/contracts/nfse-adn-endpoint.js.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts +77 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.d.ts.map +1 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js +215 -0
- package/dist/fiscal/contracts/nfse-adn-envelope.js.map +1 -0
- package/dist/fiscal/coverage/model.d.ts +114 -0
- package/dist/fiscal/coverage/model.d.ts.map +1 -0
- package/dist/fiscal/coverage/model.js +130 -0
- package/dist/fiscal/coverage/model.js.map +1 -0
- package/dist/fiscal/coverage/requests.d.ts +70 -0
- package/dist/fiscal/coverage/requests.d.ts.map +1 -0
- package/dist/fiscal/coverage/requests.js +95 -0
- package/dist/fiscal/coverage/requests.js.map +1 -0
- package/dist/fiscal/credentials/inspect.d.ts +114 -0
- package/dist/fiscal/credentials/inspect.d.ts.map +1 -0
- package/dist/fiscal/credentials/inspect.js +178 -0
- package/dist/fiscal/credentials/inspect.js.map +1 -0
- package/dist/fiscal/credentials/material.d.ts +81 -0
- package/dist/fiscal/credentials/material.d.ts.map +1 -0
- package/dist/fiscal/credentials/material.js +164 -0
- package/dist/fiscal/credentials/material.js.map +1 -0
- package/dist/fiscal/credentials/onboarding.d.ts +119 -0
- package/dist/fiscal/credentials/onboarding.d.ts.map +1 -0
- package/dist/fiscal/credentials/onboarding.js +259 -0
- package/dist/fiscal/credentials/onboarding.js.map +1 -0
- package/dist/fiscal/credentials/readiness.d.ts +119 -0
- package/dist/fiscal/credentials/readiness.d.ts.map +1 -0
- package/dist/fiscal/credentials/readiness.js +186 -0
- package/dist/fiscal/credentials/readiness.js.map +1 -0
- package/dist/fiscal/eligibility.d.ts +106 -0
- package/dist/fiscal/eligibility.d.ts.map +1 -0
- package/dist/fiscal/eligibility.js +194 -0
- package/dist/fiscal/eligibility.js.map +1 -0
- package/dist/fiscal/enrollment.d.ts +91 -0
- package/dist/fiscal/enrollment.d.ts.map +1 -0
- package/dist/fiscal/enrollment.js +126 -0
- package/dist/fiscal/enrollment.js.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts +57 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.d.ts.map +1 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js +121 -0
- package/dist/fiscal/ingestion/__fixtures__/nfse.js.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts +123 -0
- package/dist/fiscal/ingestion/adn-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/adn-transport.js +220 -0
- package/dist/fiscal/ingestion/adn-transport.js.map +1 -0
- package/dist/fiscal/ingestion/direction.d.ts +60 -0
- package/dist/fiscal/ingestion/direction.d.ts.map +1 -0
- package/dist/fiscal/ingestion/direction.js +32 -0
- package/dist/fiscal/ingestion/direction.js.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts +91 -0
- package/dist/fiscal/ingestion/nfse-adn.d.ts.map +1 -0
- package/dist/fiscal/ingestion/nfse-adn.js +222 -0
- package/dist/fiscal/ingestion/nfse-adn.js.map +1 -0
- package/dist/fiscal/ingestion/pipeline.d.ts +168 -0
- package/dist/fiscal/ingestion/pipeline.d.ts.map +1 -0
- package/dist/fiscal/ingestion/pipeline.js +699 -0
- package/dist/fiscal/ingestion/pipeline.js.map +1 -0
- package/dist/fiscal/ingestion/provider.d.ts +206 -0
- package/dist/fiscal/ingestion/provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/provider.js +47 -0
- package/dist/fiscal/ingestion/provider.js.map +1 -0
- package/dist/fiscal/ingestion/repository.d.ts +82 -0
- package/dist/fiscal/ingestion/repository.d.ts.map +1 -0
- package/dist/fiscal/ingestion/repository.js +127 -0
- package/dist/fiscal/ingestion/repository.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts +92 -0
- package/dist/fiscal/ingestion/synthetic-provider.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-provider.js +99 -0
- package/dist/fiscal/ingestion/synthetic-provider.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts +19 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js +9 -0
- package/dist/fiscal/ingestion/synthetic-transport-types.js.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts +55 -0
- package/dist/fiscal/ingestion/synthetic-transport.d.ts.map +1 -0
- package/dist/fiscal/ingestion/synthetic-transport.js +57 -0
- package/dist/fiscal/ingestion/synthetic-transport.js.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts +55 -0
- package/dist/fiscal/ingestion/xml-reader.d.ts.map +1 -0
- package/dist/fiscal/ingestion/xml-reader.js +112 -0
- package/dist/fiscal/ingestion/xml-reader.js.map +1 -0
- package/dist/fiscal/repository.d.ts +220 -0
- package/dist/fiscal/repository.d.ts.map +1 -0
- package/dist/fiscal/repository.js +449 -0
- package/dist/fiscal/repository.js.map +1 -0
- package/dist/fiscal/sync/circuit.d.ts +86 -0
- package/dist/fiscal/sync/circuit.d.ts.map +1 -0
- package/dist/fiscal/sync/circuit.js +118 -0
- package/dist/fiscal/sync/circuit.js.map +1 -0
- package/dist/fiscal/sync/intervention.d.ts +81 -0
- package/dist/fiscal/sync/intervention.d.ts.map +1 -0
- package/dist/fiscal/sync/intervention.js +135 -0
- package/dist/fiscal/sync/intervention.js.map +1 -0
- package/dist/fiscal/sync/lease.d.ts +118 -0
- package/dist/fiscal/sync/lease.d.ts.map +1 -0
- package/dist/fiscal/sync/lease.js +139 -0
- package/dist/fiscal/sync/lease.js.map +1 -0
- package/dist/fiscal/sync/observability.d.ts +148 -0
- package/dist/fiscal/sync/observability.d.ts.map +1 -0
- package/dist/fiscal/sync/observability.js +239 -0
- package/dist/fiscal/sync/observability.js.map +1 -0
- package/dist/fiscal/sync/orchestrator.d.ts +132 -0
- package/dist/fiscal/sync/orchestrator.d.ts.map +1 -0
- package/dist/fiscal/sync/orchestrator.js +487 -0
- package/dist/fiscal/sync/orchestrator.js.map +1 -0
- package/dist/fiscal/sync/policy.d.ts +87 -0
- package/dist/fiscal/sync/policy.d.ts.map +1 -0
- package/dist/fiscal/sync/policy.js +136 -0
- package/dist/fiscal/sync/policy.js.map +1 -0
- package/dist/fiscal/sync/reprocess.d.ts +76 -0
- package/dist/fiscal/sync/reprocess.d.ts.map +1 -0
- package/dist/fiscal/sync/reprocess.js +237 -0
- package/dist/fiscal/sync/reprocess.js.map +1 -0
- package/dist/fiscal/sync/retry.d.ts +82 -0
- package/dist/fiscal/sync/retry.d.ts.map +1 -0
- package/dist/fiscal/sync/retry.js +176 -0
- package/dist/fiscal/sync/retry.js.map +1 -0
- package/dist/fiscal/sync/secret-boundary.d.ts +169 -0
- package/dist/fiscal/sync/secret-boundary.d.ts.map +1 -0
- package/dist/fiscal/sync/secret-boundary.js +116 -0
- package/dist/fiscal/sync/secret-boundary.js.map +1 -0
- package/dist/fiscal/transport/https.d.ts +86 -0
- package/dist/fiscal/transport/https.d.ts.map +1 -0
- package/dist/fiscal/transport/https.js +303 -0
- package/dist/fiscal/transport/https.js.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts +99 -0
- package/dist/fiscal/transport/synthetic-tls.d.ts.map +1 -0
- package/dist/fiscal/transport/synthetic-tls.js +374 -0
- package/dist/fiscal/transport/synthetic-tls.js.map +1 -0
- package/dist/fiscal/transport/types.d.ts +134 -0
- package/dist/fiscal/transport/types.d.ts.map +1 -0
- package/dist/fiscal/transport/types.js +88 -0
- package/dist/fiscal/transport/types.js.map +1 -0
- package/dist/import/br-documents.d.ts +26 -0
- package/dist/import/br-documents.d.ts.map +1 -0
- package/dist/import/br-documents.js +78 -0
- package/dist/import/br-documents.js.map +1 -0
- package/dist/import/clients-import.d.ts +122 -4
- package/dist/import/clients-import.d.ts.map +1 -1
- package/dist/import/clients-import.js +341 -41
- package/dist/import/clients-import.js.map +1 -1
- package/dist/index.d.ts +145 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +120 -7
- package/dist/index.js.map +1 -1
- package/dist/legal/documents.d.ts +12 -1
- package/dist/legal/documents.d.ts.map +1 -1
- package/dist/legal/documents.js +162 -18
- package/dist/legal/documents.js.map +1 -1
- package/dist/legal/index.d.ts +2 -2
- package/dist/legal/index.d.ts.map +1 -1
- package/dist/legal/index.js +1 -1
- package/dist/legal/index.js.map +1 -1
- package/dist/legal/types.d.ts +114 -2
- package/dist/legal/types.d.ts.map +1 -1
- package/dist/legal/types.js.map +1 -1
- package/dist/onboarding/persistence.d.ts +10 -1
- package/dist/onboarding/persistence.d.ts.map +1 -1
- package/dist/onboarding/persistence.js +4 -4
- package/dist/onboarding/persistence.js.map +1 -1
- package/dist/pilot/go-live-checklist.d.ts +41 -0
- package/dist/pilot/go-live-checklist.d.ts.map +1 -0
- package/dist/pilot/go-live-checklist.js +209 -0
- package/dist/pilot/go-live-checklist.js.map +1 -0
- package/dist/pilot/milestone.d.ts +56 -0
- package/dist/pilot/milestone.d.ts.map +1 -0
- package/dist/pilot/milestone.js +74 -0
- package/dist/pilot/milestone.js.map +1 -0
- package/dist/platform/capabilities.d.ts +88 -0
- package/dist/platform/capabilities.d.ts.map +1 -0
- package/dist/platform/capabilities.js +169 -0
- package/dist/platform/capabilities.js.map +1 -0
- package/dist/platform/job-contract.d.ts +232 -0
- package/dist/platform/job-contract.d.ts.map +1 -0
- package/dist/platform/job-contract.js +403 -0
- package/dist/platform/job-contract.js.map +1 -0
- package/dist/rbac/catalog.d.ts.map +1 -1
- package/dist/rbac/catalog.js +110 -0
- package/dist/rbac/catalog.js.map +1 -1
- package/dist/subscription-billing/index.d.ts +8 -5
- package/dist/subscription-billing/index.d.ts.map +1 -1
- package/dist/subscription-billing/index.js +4 -3
- package/dist/subscription-billing/index.js.map +1 -1
- package/dist/subscription-billing/platform-exemption.d.ts +89 -0
- package/dist/subscription-billing/platform-exemption.d.ts.map +1 -0
- package/dist/subscription-billing/platform-exemption.js +113 -0
- package/dist/subscription-billing/platform-exemption.js.map +1 -0
- package/dist/subscription-billing/service.d.ts +74 -0
- package/dist/subscription-billing/service.d.ts.map +1 -1
- package/dist/subscription-billing/service.js +182 -16
- package/dist/subscription-billing/service.js.map +1 -1
- package/dist/tenancy/features.d.ts +69 -0
- package/dist/tenancy/features.d.ts.map +1 -0
- package/dist/tenancy/features.js +123 -0
- package/dist/tenancy/features.js.map +1 -0
- package/dist/tenancy/settings.d.ts +63 -0
- package/dist/tenancy/settings.d.ts.map +1 -0
- package/dist/tenancy/settings.js +218 -0
- package/dist/tenancy/settings.js.map +1 -0
- package/dist/users/repository.d.ts +16 -1
- package/dist/users/repository.d.ts.map +1 -1
- package/dist/users/repository.js +24 -1
- package/dist/users/repository.js.map +1 -1
- package/dist/vault/repository.d.ts +69 -1
- package/dist/vault/repository.d.ts.map +1 -1
- package/dist/vault/repository.js +88 -5
- package/dist/vault/repository.js.map +1 -1
- package/package.json +10 -2
- package/src/db/migrations/0045_role_write_scope.sql +122 -0
- package/src/db/migrations/0046_pilot_activation_model.sql +184 -0
- package/src/db/migrations/0047_recipient_clearance.sql +89 -0
- package/src/db/migrations/0048_item_type_note.sql +16 -0
- package/src/db/migrations/0049_national_fiscal_engine.sql +279 -0
- package/src/db/migrations/0050_fiscal_vocabulary_readonly.sql +29 -0
- package/src/db/migrations/0051_seed_rules_from_catalog.sql +72 -0
- package/src/db/migrations/0052_fiscal_rule_delete_scope.sql +57 -0
- package/src/db/migrations/0053_rule_validity_lower_bound.sql +44 -0
- package/src/db/migrations/0054_tenant_profile_and_rule_source.sql +89 -0
- package/src/db/migrations/0055_job_capability_contract.sql +300 -0
- package/src/db/migrations/0056_fiscal_document_ingestion.sql +337 -0
- package/src/db/migrations/0057_fiscal_pending_event_inbox.sql +228 -0
- package/src/db/migrations/0058_fiscal_operational_engine.sql +516 -0
- package/src/db/migrations/0059_fiscal_contract_version.sql +59 -0
- package/src/db/migrations/0060_fiscal_credential_vault_and_run_authorization.sql +321 -0
- package/src/db/migrations/0061_client_official_registry_provenance.sql +193 -0
- package/src/db/migrations/0062_first_contact_and_capability_truth.sql +119 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { FiscalTransportError } from '../transport/types.js';
|
|
2
|
+
import { FiscalProviderError } from '../ingestion/provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* Perfil de recuo por categoria.
|
|
5
|
+
*
|
|
6
|
+
* `base` é a espera da PRIMEIRA tentativa falha; ela dobra a cada tentativa até
|
|
7
|
+
* `cap`. Os números não são arbitrários:
|
|
8
|
+
*
|
|
9
|
+
* - `PROVIDER_RATE_LIMIT` começa em uma HORA porque é o que a NT 2014.002 §3.5
|
|
10
|
+
* exige, e errar para menos custa o CNPJ de um terceiro.
|
|
11
|
+
* - `AUTHENTICATION_FAILED` e as duas de certificado não têm recuo: elas não
|
|
12
|
+
* retentam. O campo existe como zero explícito, para que ninguém leia a
|
|
13
|
+
* ausência como "use o default".
|
|
14
|
+
* - `NETWORK_TRANSIENT` começa em 30s: curto o bastante para um soluço de rede
|
|
15
|
+
* caber dentro do mesmo ciclo, longo o bastante para não ser um laço.
|
|
16
|
+
*/
|
|
17
|
+
const PROFILE = {
|
|
18
|
+
NETWORK_TRANSIENT: { retryable: true, baseMs: 30_000, capMs: 900_000, provider: true },
|
|
19
|
+
PROVIDER_RATE_LIMIT: { retryable: true, baseMs: 3_600_000, capMs: 21_600_000, provider: true },
|
|
20
|
+
PROVIDER_TEMPORARILY_UNAVAILABLE: {
|
|
21
|
+
retryable: true,
|
|
22
|
+
baseMs: 300_000,
|
|
23
|
+
capMs: 3_600_000,
|
|
24
|
+
provider: true,
|
|
25
|
+
},
|
|
26
|
+
AUTHENTICATION_FAILED: { retryable: false, baseMs: 0, capMs: 0, provider: false },
|
|
27
|
+
CERTIFICATE_INVALID: { retryable: false, baseMs: 0, capMs: 0, provider: false },
|
|
28
|
+
CERTIFICATE_EXPIRED: { retryable: false, baseMs: 0, capMs: 0, provider: false },
|
|
29
|
+
PERMISSION_DENIED: { retryable: false, baseMs: 0, capMs: 0, provider: false },
|
|
30
|
+
// Resposta que não é o que o contrato promete pode ser um deploy ruim do
|
|
31
|
+
// provedor — volta sozinho — mas insistir rápido não ajuda em nada.
|
|
32
|
+
BAD_RESPONSE: { retryable: true, baseMs: 600_000, capMs: 3_600_000, provider: true },
|
|
33
|
+
// Documento ilegível é determinístico: o MESMO XML vai falhar de novo. Ele já
|
|
34
|
+
// ficou preservado na caixa de entrada pelo pipeline; retentar o lote não o
|
|
35
|
+
// conserta e ainda gasta a cota do cliente.
|
|
36
|
+
MALFORMED_DOCUMENT: { retryable: false, baseMs: 0, capMs: 0, provider: false },
|
|
37
|
+
// Outro processo mexeu no cursor. Volta sozinho, e rápido: o conflito é nosso.
|
|
38
|
+
CURSOR_CONFLICT: { retryable: true, baseMs: 60_000, capMs: 600_000, provider: false },
|
|
39
|
+
INTERNAL_ERROR: { retryable: true, baseMs: 300_000, capMs: 3_600_000, provider: false },
|
|
40
|
+
};
|
|
41
|
+
const INTERVENTION = {
|
|
42
|
+
AUTHENTICATION_FAILED: 'auth_required',
|
|
43
|
+
CERTIFICATE_EXPIRED: 'certificate_expired',
|
|
44
|
+
CERTIFICATE_INVALID: 'certificate_invalid',
|
|
45
|
+
PERMISSION_DENIED: 'provider_access_denied',
|
|
46
|
+
};
|
|
47
|
+
/** Classe do provedor → categoria de decisão. */
|
|
48
|
+
export function categorizeProviderError(cls) {
|
|
49
|
+
switch (cls) {
|
|
50
|
+
case 'transient':
|
|
51
|
+
return 'PROVIDER_TEMPORARILY_UNAVAILABLE';
|
|
52
|
+
case 'throttled':
|
|
53
|
+
return 'PROVIDER_RATE_LIMIT';
|
|
54
|
+
case 'auth':
|
|
55
|
+
return 'AUTHENTICATION_FAILED';
|
|
56
|
+
case 'not_allowed':
|
|
57
|
+
return 'PERMISSION_DENIED';
|
|
58
|
+
case 'invalid':
|
|
59
|
+
return 'MALFORMED_DOCUMENT';
|
|
60
|
+
case 'unknown':
|
|
61
|
+
// Não classificado é tratado como transitório COM TETO — nunca como
|
|
62
|
+
// permanente (perderia recuperação) nem como retentável para sempre.
|
|
63
|
+
return 'NETWORK_TRANSIENT';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Classe do transporte → categoria de decisão. */
|
|
67
|
+
export function categorizeTransportError(cls) {
|
|
68
|
+
switch (cls) {
|
|
69
|
+
case 'network':
|
|
70
|
+
return 'NETWORK_TRANSIENT';
|
|
71
|
+
case 'timeout':
|
|
72
|
+
// Timeout NÃO é "não aconteceu": o servidor pode ter processado. Retenta,
|
|
73
|
+
// e a idempotência da ingestão é quem absorve a repetição.
|
|
74
|
+
return 'NETWORK_TRANSIENT';
|
|
75
|
+
case 'tls':
|
|
76
|
+
return 'PROVIDER_TEMPORARILY_UNAVAILABLE';
|
|
77
|
+
case 'certificate':
|
|
78
|
+
return 'CERTIFICATE_INVALID';
|
|
79
|
+
case 'protocol':
|
|
80
|
+
return 'BAD_RESPONSE';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Status HTTP → categoria, para provedores REST (o ADN é um). */
|
|
84
|
+
export function categorizeHttpStatus(status) {
|
|
85
|
+
if (status === 401)
|
|
86
|
+
return 'AUTHENTICATION_FAILED';
|
|
87
|
+
if (status === 403)
|
|
88
|
+
return 'PERMISSION_DENIED';
|
|
89
|
+
if (status === 429)
|
|
90
|
+
return 'PROVIDER_RATE_LIMIT';
|
|
91
|
+
if (status === 408 || status === 504)
|
|
92
|
+
return 'NETWORK_TRANSIENT';
|
|
93
|
+
if (status === 503 || status === 502)
|
|
94
|
+
return 'PROVIDER_TEMPORARILY_UNAVAILABLE';
|
|
95
|
+
if (status >= 500)
|
|
96
|
+
return 'PROVIDER_TEMPORARILY_UNAVAILABLE';
|
|
97
|
+
if (status >= 400)
|
|
98
|
+
return 'BAD_RESPONSE';
|
|
99
|
+
return 'INTERNAL_ERROR';
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Decide o que fazer com uma falha.
|
|
103
|
+
*
|
|
104
|
+
* ## Jitter é obrigatório, não enfeite
|
|
105
|
+
*
|
|
106
|
+
* Sem ele, cem clientes que falharam no mesmo minuto voltam no mesmo minuto —
|
|
107
|
+
* o rebanho que derruba o provedor de novo assim que ele levanta. O jitter é
|
|
108
|
+
* "full jitter": um sorteio em `[0, espera]`, e não `espera ± 10%`. A variante
|
|
109
|
+
* completa é a que realmente espalha; a estreita só desloca o rebanho.
|
|
110
|
+
*
|
|
111
|
+
* ## `Retry-After` vence o nosso cálculo — com piso
|
|
112
|
+
*
|
|
113
|
+
* Quando o servidor diz quando voltar, ele sabe mais do que nós. Mas um
|
|
114
|
+
* `Retry-After: 0` num 429 é o servidor se contradizendo; o piso de 60s existe
|
|
115
|
+
* para que a obediência não vire laço.
|
|
116
|
+
*/
|
|
117
|
+
export function decideFiscalRetry(category, input,
|
|
118
|
+
/** Código curto do provedor/transporte. Sem ele, a categoria serve de rótulo. */
|
|
119
|
+
code = category) {
|
|
120
|
+
const profile = PROFILE[category];
|
|
121
|
+
const escalateAfter = input.humanEscalationAfter ?? 5;
|
|
122
|
+
if (!profile.retryable) {
|
|
123
|
+
return {
|
|
124
|
+
category,
|
|
125
|
+
retryable: false,
|
|
126
|
+
nextAttemptAt: null,
|
|
127
|
+
countsAgainstProvider: profile.provider,
|
|
128
|
+
interventionKind: INTERVENTION[category] ?? null,
|
|
129
|
+
code,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
let nextAttemptAt;
|
|
133
|
+
if (input.retryAfter && input.retryAfter > input.now) {
|
|
134
|
+
const floorMs = category === 'PROVIDER_RATE_LIMIT' ? 60_000 : 0;
|
|
135
|
+
const asked = input.retryAfter.getTime() - input.now.getTime();
|
|
136
|
+
nextAttemptAt = new Date(input.now.getTime() + Math.max(asked, floorMs));
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// Expoente limitado a 6 antes do teto: 2^6 já ultrapassa qualquer `capMs`
|
|
140
|
+
// desta tabela, e deixar o expoente crescer sem limite produz `Infinity`
|
|
141
|
+
// depois de mil falhas — uma data inválida em vez de uma espera longa.
|
|
142
|
+
const exponent = Math.min(input.previousFailures, 6);
|
|
143
|
+
const ceiling = Math.min(profile.baseMs * 2 ** exponent, profile.capMs);
|
|
144
|
+
const random = input.random ?? Math.random;
|
|
145
|
+
// Full jitter com piso na metade do teto seria o "equal jitter"; aqui o
|
|
146
|
+
// sorteio é em [0, ceiling] e o piso é a base, para que a primeira falha
|
|
147
|
+
// nunca produza uma retentativa imediata.
|
|
148
|
+
const jittered = Math.floor(random() * ceiling);
|
|
149
|
+
nextAttemptAt = new Date(input.now.getTime() + Math.max(jittered, profile.baseMs));
|
|
150
|
+
}
|
|
151
|
+
// Retentável não significa retentável para sempre. Depois de N falhas
|
|
152
|
+
// consecutivas, o caso deixa de ser "o provedor oscilou" e passa a ser algo
|
|
153
|
+
// que uma pessoa precisa olhar — sem parar de retentar, porque pode voltar.
|
|
154
|
+
const escalated = input.previousFailures + 1 >= escalateAfter;
|
|
155
|
+
return {
|
|
156
|
+
category,
|
|
157
|
+
retryable: true,
|
|
158
|
+
nextAttemptAt,
|
|
159
|
+
countsAgainstProvider: profile.provider,
|
|
160
|
+
interventionKind: escalated ? 'repeated_failure' : null,
|
|
161
|
+
code,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/** Atalho: recebe o erro e devolve a decisão, sem quem chama classificar antes. */
|
|
165
|
+
export function decideFromError(err, input) {
|
|
166
|
+
if (err instanceof FiscalTransportError) {
|
|
167
|
+
return decideFiscalRetry(categorizeTransportError(err.errorClass), { ...input, retryAfter: input.retryAfter ?? err.retryAfter }, err.code);
|
|
168
|
+
}
|
|
169
|
+
if (err instanceof FiscalProviderError) {
|
|
170
|
+
return decideFiscalRetry(categorizeProviderError(err.errorClass), { ...input, retryAfter: input.retryAfter ?? err.retryAfter }, err.providerCode ?? err.errorClass);
|
|
171
|
+
}
|
|
172
|
+
// Erro não classificado é NOSSO até prova em contrário: tratá-lo como falha do
|
|
173
|
+
// provedor esconderia um defeito de código atrás de um recuo educado.
|
|
174
|
+
return decideFiscalRetry('INTERNAL_ERROR', input, 'UNCLASSIFIED');
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/fiscal/sync/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type { Tx } from '../../db/client.js';
|
|
2
|
+
import type { FiscalCredentialKind, FiscalEnvironment } from '../eligibility.js';
|
|
3
|
+
import type { FiscalDocumentAdapter, FiscalDocumentType, FiscalEnvironmentTag } from '../ingestion/provider.js';
|
|
4
|
+
/**
|
|
5
|
+
* A fronteira entre "decidir se devemos sincronizar" e "abrir o cofre".
|
|
6
|
+
*
|
|
7
|
+
* ## O defeito que este módulo existe para tornar indizível
|
|
8
|
+
*
|
|
9
|
+
* A primeira escrita da Fase 2 tinha UM contrato para a fonte:
|
|
10
|
+
*
|
|
11
|
+
* adapterFactory({ tx, tenantId, clientId, documentType, environment })
|
|
12
|
+
* → { adapter, dispose } | null
|
|
13
|
+
*
|
|
14
|
+
* Ele devolvia o adapter JÁ com transporte e credencial. Quem o implementasse
|
|
15
|
+
* para homologação ou produção teria de decifrar o material do certificado ali
|
|
16
|
+
* dentro — não por descuido, mas porque era isso que o contrato pedia. E o
|
|
17
|
+
* orquestrador o chamava logo depois da cadência, ANTES da janela do cursor, do
|
|
18
|
+
* disjuntor, da prontidão da credencial, do CNPJ do ator e do lease.
|
|
19
|
+
*
|
|
20
|
+
* O resultado era estrutural, não hipotético: cinco portões que sabem dizer
|
|
21
|
+
* "não" sem tocar em segredo nenhum ficavam depois do acesso ao cofre. Um
|
|
22
|
+
* escritório com duzentos clientes cujo disjuntor estivesse aberto decifraria
|
|
23
|
+
* duzentos certificados para em seguida não fazer requisição alguma.
|
|
24
|
+
*
|
|
25
|
+
* ## A separação: descritor primeiro, material depois
|
|
26
|
+
*
|
|
27
|
+
* A fonte passa a ser resolvida em duas etapas com custos diferentes:
|
|
28
|
+
*
|
|
29
|
+
* descritor quem é o provedor, qual ambiente, qual slug de fonte, qual
|
|
30
|
+
* teto de lote, qual credencial ele exige. Tudo isto é METADATA:
|
|
31
|
+
* sai de configuração e de tabela, e nenhuma parte exige abrir
|
|
32
|
+
* material criptográfico.
|
|
33
|
+
*
|
|
34
|
+
* materialize agora sim: cofre, chave privada, agente de TLS mútuo, adapter.
|
|
35
|
+
*
|
|
36
|
+
* O descritor é o que os portões precisam — a fonte (`source`) governa cursor,
|
|
37
|
+
* disjuntor e prontidão, e ela vem do descritor. `materialize` só é convidado
|
|
38
|
+
* quando não sobrou nenhum motivo para não sincronizar.
|
|
39
|
+
*
|
|
40
|
+
* ## Por que a autorização é um objeto, e não um booleano
|
|
41
|
+
*
|
|
42
|
+
* Uma convenção ("chame materialize só depois dos portões") volta a ser violada
|
|
43
|
+
* no primeiro refactor, em silêncio. Aqui a autorização é um valor que só o
|
|
44
|
+
* orquestrador consegue emitir, e `loadFiscalTlsMaterial` a exige.
|
|
45
|
+
*
|
|
46
|
+
* A marca não é um campo: é um `WeakSet` deste módulo. Um objeto com a forma
|
|
47
|
+
* certa não passa; uma cópia por spread do objeto certo também não passa. Só
|
|
48
|
+
* passa a instância que `grantFiscalSecretAccess` devolveu — e essa função não
|
|
49
|
+
* é reexportada pelo `index` do pacote, de modo que fora de `@baruk/core` não
|
|
50
|
+
* existe caminho para fabricá-la.
|
|
51
|
+
*
|
|
52
|
+
* Isso não é defesa contra um adversário com acesso ao processo: é a defesa
|
|
53
|
+
* contra a próxima pessoa apressada, que é quem de fato reintroduz este defeito.
|
|
54
|
+
*/
|
|
55
|
+
/** Violação da fronteira. Classe e contexto — nunca material, nunca ponteiro. */
|
|
56
|
+
export declare class FiscalSecretBoundaryError extends Error {
|
|
57
|
+
readonly stage: string;
|
|
58
|
+
constructor(stage: string);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* O passe para o cofre.
|
|
62
|
+
*
|
|
63
|
+
* Todo campo aqui é seguro para trilha: identificadores, slugs e uma impressão
|
|
64
|
+
* digital truncada. Nenhum deles é ou deriva de material criptográfico.
|
|
65
|
+
*/
|
|
66
|
+
export interface FiscalSecretAuthorization {
|
|
67
|
+
readonly tenantId: string;
|
|
68
|
+
readonly clientId: string;
|
|
69
|
+
readonly source: string;
|
|
70
|
+
readonly environment: FiscalEnvironment;
|
|
71
|
+
readonly documentType: FiscalDocumentType;
|
|
72
|
+
readonly credentialKind: FiscalCredentialKind;
|
|
73
|
+
/** A vez já está tomada quando o material é aberto. Ver `orchestrator.ts`. */
|
|
74
|
+
readonly leaseId: string;
|
|
75
|
+
/** sha256 truncado registrado no cadastro, quando existe. Seguro em tela. */
|
|
76
|
+
readonly credentialFingerprint: string | null;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Emite o passe. Chamada em UM lugar: o orquestrador, depois do último portão.
|
|
80
|
+
*
|
|
81
|
+
* Deliberadamente ausente do `index.ts` do pacote. Um `grep` por este nome
|
|
82
|
+
* responde "quem pode autorizar a abertura do cofre fiscal?" — e a resposta tem
|
|
83
|
+
* de caber em uma tela.
|
|
84
|
+
*/
|
|
85
|
+
export declare function grantFiscalSecretAccess(input: FiscalSecretAuthorization): FiscalSecretAuthorization;
|
|
86
|
+
/**
|
|
87
|
+
* Recusa qualquer coisa que não tenha saído de `grantFiscalSecretAccess`.
|
|
88
|
+
*
|
|
89
|
+
* Lança em vez de devolver `false` porque não existe caminho de recuperação:
|
|
90
|
+
* chegar aqui sem passe significa que a ordem dos portões foi quebrada, e
|
|
91
|
+
* seguir adiante seria exatamente o dano que a fronteira existe para impedir.
|
|
92
|
+
*/
|
|
93
|
+
export declare function assertFiscalSecretAccess(auth: FiscalSecretAuthorization | null | undefined, stage: string): asserts auth is FiscalSecretAuthorization;
|
|
94
|
+
/**
|
|
95
|
+
* O que se sabe de uma fonte SEM abrir nada.
|
|
96
|
+
*
|
|
97
|
+
* Espelha os campos do adapter que os portões consultam. Não é duplicação
|
|
98
|
+
* acidental: é o subconjunto que pode ser conhecido antes da credencial, e
|
|
99
|
+
* mantê-lo separado é o que impede alguém de "só espiar o adapter" para
|
|
100
|
+
* descobrir o `source`.
|
|
101
|
+
*/
|
|
102
|
+
export interface FiscalSourceDescriptor {
|
|
103
|
+
/** Slug estável. Governa `fiscal_document.source`, cursor, disjuntor. */
|
|
104
|
+
readonly source: string;
|
|
105
|
+
readonly documentTypes: readonly FiscalDocumentType[];
|
|
106
|
+
readonly environments: readonly FiscalEnvironmentTag[];
|
|
107
|
+
readonly batchLimit: number;
|
|
108
|
+
readonly exhaustedBackoffSeconds: number;
|
|
109
|
+
/**
|
|
110
|
+
* Qual credencial esta fonte exige. É o que a prontidão avalia — e é metadata:
|
|
111
|
+
* saber que o ADN pede A1 não exige ter um A1 aberto.
|
|
112
|
+
*/
|
|
113
|
+
readonly credentialKind: FiscalCredentialKind;
|
|
114
|
+
}
|
|
115
|
+
/** O adapter já materializado, com o descarte do material que o sustenta. */
|
|
116
|
+
export interface FiscalAdapterMaterialization {
|
|
117
|
+
adapter: FiscalDocumentAdapter;
|
|
118
|
+
/** Zera o material em memória. Chamado em TODO caminho de saída. */
|
|
119
|
+
dispose?: () => void;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Materializa o adapter. Só aqui o cofre pode ser aberto.
|
|
123
|
+
*
|
|
124
|
+
* `null` significa "o material não está disponível agora" — ponteiro que não
|
|
125
|
+
* resolve, envelope ilegível, cofre indisponível. Não é exceção porque não é
|
|
126
|
+
* anormal: é um estado do cadastro, e o orquestrador o transforma em desfecho
|
|
127
|
+
* nomeado mais tarefa humana.
|
|
128
|
+
*/
|
|
129
|
+
export type FiscalSourceMaterializer = (input: {
|
|
130
|
+
tx: Tx;
|
|
131
|
+
authorization: FiscalSecretAuthorization;
|
|
132
|
+
}) => Promise<FiscalAdapterMaterialization | null>;
|
|
133
|
+
/** Descritor mais a promessa de materialização. Uma resolução de fonte. */
|
|
134
|
+
export interface FiscalSourceResolution {
|
|
135
|
+
descriptor: FiscalSourceDescriptor;
|
|
136
|
+
materialize: FiscalSourceMaterializer;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Resolve a fonte de um cliente a partir de METADATA.
|
|
140
|
+
*
|
|
141
|
+
* Recebe `tx` porque a resolução pode consultar cobertura, jurisdição ou
|
|
142
|
+
* configuração do tenant — todas leituras de tabela. O que ela não pode fazer é
|
|
143
|
+
* abrir o cofre: `loadFiscalTlsMaterial` exige um passe, e nesta etapa não
|
|
144
|
+
* existe passe nenhum.
|
|
145
|
+
*
|
|
146
|
+
* `null` não é falha: é a resposta correta para "NFS-e de um município que não
|
|
147
|
+
* aderiu ao ADN". O orquestrador a transforma em `no_adapter` mais tarefa.
|
|
148
|
+
*/
|
|
149
|
+
export type FiscalSourceResolver = (input: {
|
|
150
|
+
tx: Tx;
|
|
151
|
+
tenantId: string;
|
|
152
|
+
clientId: string;
|
|
153
|
+
documentType: FiscalDocumentType;
|
|
154
|
+
environment: FiscalEnvironment;
|
|
155
|
+
}) => Promise<FiscalSourceResolution | null>;
|
|
156
|
+
/**
|
|
157
|
+
* Descritor derivado de um adapter JÁ construído.
|
|
158
|
+
*
|
|
159
|
+
* Existe para as fontes que não têm segredo a materializar — hoje, o provedor
|
|
160
|
+
* sintético. Construir o adapter durante a resolução do descritor só é legítimo
|
|
161
|
+
* porque ali não há cofre a abrir: um adapter que exija material de certificado
|
|
162
|
+
* NÃO pode nascer nesta etapa, e é para esse caso que `materialize` existe.
|
|
163
|
+
*
|
|
164
|
+
* A alternativa seria repetir os cinco campos à mão em cada chamador, e a
|
|
165
|
+
* primeira divergência entre o descritor e o adapter que ele descreve
|
|
166
|
+
* apareceria como um teto de lote errado contra o ambiente nacional.
|
|
167
|
+
*/
|
|
168
|
+
export declare function describeAdapter(adapter: FiscalDocumentAdapter, credentialKind?: FiscalCredentialKind): FiscalSourceDescriptor;
|
|
169
|
+
//# sourceMappingURL=secret-boundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-boundary.d.ts","sourceRoot":"","sources":["../../../src/fiscal/sync/secret-boundary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,iFAAiF;AACjF,qBAAa,yBAA0B,SAAQ,KAAK;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CAInC;AAED;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAC;IAC9C,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C;AAYD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,yBAAyB,GAC/B,yBAAyB,CAI3B;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,yBAAyB,GAAG,IAAI,GAAG,SAAS,EAClD,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,IAAI,yBAAyB,CAI3C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACtD,QAAQ,CAAC,YAAY,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACvD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAC;CAC/C;AAED,6EAA6E;AAC7E,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,qBAAqB,CAAC;IAC/B,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE;IAC7C,EAAE,EAAE,EAAE,CAAC;IACP,aAAa,EAAE,yBAAyB,CAAC;CAC1C,KAAK,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC,CAAC;AAEnD,2EAA2E;AAC3E,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,sBAAsB,CAAC;IACnC,WAAW,EAAE,wBAAwB,CAAC;CACvC;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE;IACzC,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,kBAAkB,CAAC;IACjC,WAAW,EAAE,iBAAiB,CAAC;CAChC,KAAK,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;AAE7C;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,qBAAqB,EAC9B,cAAc,GAAE,oBAAuC,GACtD,sBAAsB,CASxB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A fronteira entre "decidir se devemos sincronizar" e "abrir o cofre".
|
|
3
|
+
*
|
|
4
|
+
* ## O defeito que este módulo existe para tornar indizível
|
|
5
|
+
*
|
|
6
|
+
* A primeira escrita da Fase 2 tinha UM contrato para a fonte:
|
|
7
|
+
*
|
|
8
|
+
* adapterFactory({ tx, tenantId, clientId, documentType, environment })
|
|
9
|
+
* → { adapter, dispose } | null
|
|
10
|
+
*
|
|
11
|
+
* Ele devolvia o adapter JÁ com transporte e credencial. Quem o implementasse
|
|
12
|
+
* para homologação ou produção teria de decifrar o material do certificado ali
|
|
13
|
+
* dentro — não por descuido, mas porque era isso que o contrato pedia. E o
|
|
14
|
+
* orquestrador o chamava logo depois da cadência, ANTES da janela do cursor, do
|
|
15
|
+
* disjuntor, da prontidão da credencial, do CNPJ do ator e do lease.
|
|
16
|
+
*
|
|
17
|
+
* O resultado era estrutural, não hipotético: cinco portões que sabem dizer
|
|
18
|
+
* "não" sem tocar em segredo nenhum ficavam depois do acesso ao cofre. Um
|
|
19
|
+
* escritório com duzentos clientes cujo disjuntor estivesse aberto decifraria
|
|
20
|
+
* duzentos certificados para em seguida não fazer requisição alguma.
|
|
21
|
+
*
|
|
22
|
+
* ## A separação: descritor primeiro, material depois
|
|
23
|
+
*
|
|
24
|
+
* A fonte passa a ser resolvida em duas etapas com custos diferentes:
|
|
25
|
+
*
|
|
26
|
+
* descritor quem é o provedor, qual ambiente, qual slug de fonte, qual
|
|
27
|
+
* teto de lote, qual credencial ele exige. Tudo isto é METADATA:
|
|
28
|
+
* sai de configuração e de tabela, e nenhuma parte exige abrir
|
|
29
|
+
* material criptográfico.
|
|
30
|
+
*
|
|
31
|
+
* materialize agora sim: cofre, chave privada, agente de TLS mútuo, adapter.
|
|
32
|
+
*
|
|
33
|
+
* O descritor é o que os portões precisam — a fonte (`source`) governa cursor,
|
|
34
|
+
* disjuntor e prontidão, e ela vem do descritor. `materialize` só é convidado
|
|
35
|
+
* quando não sobrou nenhum motivo para não sincronizar.
|
|
36
|
+
*
|
|
37
|
+
* ## Por que a autorização é um objeto, e não um booleano
|
|
38
|
+
*
|
|
39
|
+
* Uma convenção ("chame materialize só depois dos portões") volta a ser violada
|
|
40
|
+
* no primeiro refactor, em silêncio. Aqui a autorização é um valor que só o
|
|
41
|
+
* orquestrador consegue emitir, e `loadFiscalTlsMaterial` a exige.
|
|
42
|
+
*
|
|
43
|
+
* A marca não é um campo: é um `WeakSet` deste módulo. Um objeto com a forma
|
|
44
|
+
* certa não passa; uma cópia por spread do objeto certo também não passa. Só
|
|
45
|
+
* passa a instância que `grantFiscalSecretAccess` devolveu — e essa função não
|
|
46
|
+
* é reexportada pelo `index` do pacote, de modo que fora de `@baruk/core` não
|
|
47
|
+
* existe caminho para fabricá-la.
|
|
48
|
+
*
|
|
49
|
+
* Isso não é defesa contra um adversário com acesso ao processo: é a defesa
|
|
50
|
+
* contra a próxima pessoa apressada, que é quem de fato reintroduz este defeito.
|
|
51
|
+
*/
|
|
52
|
+
/** Violação da fronteira. Classe e contexto — nunca material, nunca ponteiro. */
|
|
53
|
+
export class FiscalSecretBoundaryError extends Error {
|
|
54
|
+
stage;
|
|
55
|
+
constructor(stage) {
|
|
56
|
+
super(`SECRET_BOUNDARY_VIOLATION: ${stage}`);
|
|
57
|
+
this.stage = stage;
|
|
58
|
+
this.name = 'FiscalSecretBoundaryError';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* As autorizações realmente emitidas.
|
|
63
|
+
*
|
|
64
|
+
* `WeakSet` e não um campo `Symbol`: um campo sobrevive a `{...auth}`, a
|
|
65
|
+
* `structuredClone` e a `JSON.parse(JSON.stringify(auth))`, e qualquer uma
|
|
66
|
+
* dessas três é como a checagem passaria a aceitar um objeto que os portões
|
|
67
|
+
* nunca aprovaram.
|
|
68
|
+
*/
|
|
69
|
+
const emitidas = new WeakSet();
|
|
70
|
+
/**
|
|
71
|
+
* Emite o passe. Chamada em UM lugar: o orquestrador, depois do último portão.
|
|
72
|
+
*
|
|
73
|
+
* Deliberadamente ausente do `index.ts` do pacote. Um `grep` por este nome
|
|
74
|
+
* responde "quem pode autorizar a abertura do cofre fiscal?" — e a resposta tem
|
|
75
|
+
* de caber em uma tela.
|
|
76
|
+
*/
|
|
77
|
+
export function grantFiscalSecretAccess(input) {
|
|
78
|
+
const auth = Object.freeze({ ...input });
|
|
79
|
+
emitidas.add(auth);
|
|
80
|
+
return auth;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Recusa qualquer coisa que não tenha saído de `grantFiscalSecretAccess`.
|
|
84
|
+
*
|
|
85
|
+
* Lança em vez de devolver `false` porque não existe caminho de recuperação:
|
|
86
|
+
* chegar aqui sem passe significa que a ordem dos portões foi quebrada, e
|
|
87
|
+
* seguir adiante seria exatamente o dano que a fronteira existe para impedir.
|
|
88
|
+
*/
|
|
89
|
+
export function assertFiscalSecretAccess(auth, stage) {
|
|
90
|
+
if (!auth || typeof auth !== 'object' || !emitidas.has(auth)) {
|
|
91
|
+
throw new FiscalSecretBoundaryError(stage);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Descritor derivado de um adapter JÁ construído.
|
|
96
|
+
*
|
|
97
|
+
* Existe para as fontes que não têm segredo a materializar — hoje, o provedor
|
|
98
|
+
* sintético. Construir o adapter durante a resolução do descritor só é legítimo
|
|
99
|
+
* porque ali não há cofre a abrir: um adapter que exija material de certificado
|
|
100
|
+
* NÃO pode nascer nesta etapa, e é para esse caso que `materialize` existe.
|
|
101
|
+
*
|
|
102
|
+
* A alternativa seria repetir os cinco campos à mão em cada chamador, e a
|
|
103
|
+
* primeira divergência entre o descritor e o adapter que ele descreve
|
|
104
|
+
* apareceria como um teto de lote errado contra o ambiente nacional.
|
|
105
|
+
*/
|
|
106
|
+
export function describeAdapter(adapter, credentialKind = 'certificate_a1') {
|
|
107
|
+
return {
|
|
108
|
+
source: adapter.source,
|
|
109
|
+
documentTypes: adapter.documentTypes,
|
|
110
|
+
environments: adapter.environments,
|
|
111
|
+
batchLimit: adapter.batchLimit,
|
|
112
|
+
exhaustedBackoffSeconds: adapter.exhaustedBackoffSeconds,
|
|
113
|
+
credentialKind,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=secret-boundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-boundary.js","sourceRoot":"","sources":["../../../src/fiscal/sync/secret-boundary.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,iFAAiF;AACjF,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAC7B;IAArB,YAAqB,KAAa;QAChC,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;QAD1B,UAAK,GAAL,KAAK,CAAQ;QAEhC,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAqBD;;;;;;;GAOG;AACH,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAU,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAgC;IAEhC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACzC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAkD,EAClD,KAAa;IAEb,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAqED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAC7B,OAA8B,EAC9B,iBAAuC,gBAAgB;IAEvD,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;QACxD,cAAc;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { type ClientTlsMaterial, type FiscalTransport, type FiscalTransportRequest, type FiscalTransportResponse } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* O transporte HTTPS, com TLS mútuo quando há material de cliente.
|
|
4
|
+
*
|
|
5
|
+
* ═══ A opção que este arquivo não tem ══════════════════════════════════════
|
|
6
|
+
*
|
|
7
|
+
* Não existe aqui nenhuma forma de desligar a verificação do certificado do
|
|
8
|
+
* servidor. Não é uma opção com default seguro — é uma opção que não existe,
|
|
9
|
+
* e a diferença é o ponto inteiro. Um default seguro é contornável por quem
|
|
10
|
+
* estiver com pressa às 23h de uma sexta; um caminho ausente não é.
|
|
11
|
+
*
|
|
12
|
+
* A tentação é concreta e tem nome: a cadeia ICP-Brasil não vem no bundle de CAs
|
|
13
|
+
* do sistema em várias imagens Docker, e a primeira tentativa contra o ambiente
|
|
14
|
+
* nacional falha com `UNABLE_TO_VERIFY_LEAF_SIGNATURE`. A correção correta é
|
|
15
|
+
* ACRESCENTAR a cadeia em `ca`; a correção de dois caracteres é desligar a
|
|
16
|
+
* verificação — e ela transforma TLS mútuo, cujo propósito inteiro é provar com
|
|
17
|
+
* quem se está falando, em criptografia contra ninguém. O certificado que
|
|
18
|
+
* viajaria por esse canal é o do CLIENTE, contra a Receita.
|
|
19
|
+
*
|
|
20
|
+
* `assertNoTlsBypass` confere as opções montadas ANTES de abrir o socket. É
|
|
21
|
+
* redundante com a ausência da opção, e essa redundância é o desenho: um dia
|
|
22
|
+
* alguém acrescentará um `...opcoesExtras` aqui, e o portão precisa estar no
|
|
23
|
+
* caminho do socket, não na revisão de código.
|
|
24
|
+
*
|
|
25
|
+
* ═══ Erro nunca copia texto do sistema ═════════════════════════════════════
|
|
26
|
+
*
|
|
27
|
+
* Só `err.code` atravessa. `err.message` de TLS cita o sujeito do certificado e
|
|
28
|
+
* o caminho do arquivo; `err.stack` de um cliente HTTP já carregou URL com
|
|
29
|
+
* credencial embutida neste ecossistema. Redigir o campo depois não resolve —
|
|
30
|
+
* a defesa é não copiar.
|
|
31
|
+
*/
|
|
32
|
+
export interface HttpsFiscalTransportOptions {
|
|
33
|
+
/** Material do cliente. Ausente = TLS simples (só o servidor se identifica). */
|
|
34
|
+
tls?: ClientTlsMaterial | null;
|
|
35
|
+
/** Nome para SNI e para a validação de identidade, quando difere do host. */
|
|
36
|
+
servername?: string;
|
|
37
|
+
/** Teto de conexões simultâneas. Um por cliente é o suficiente e o educado. */
|
|
38
|
+
maxSockets?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Teto de bytes do CORPO da resposta. Ausente = sem teto.
|
|
41
|
+
*
|
|
42
|
+
* Sem ele, o acúmulo em `chunks` é ilimitado: um servidor comprometido, um
|
|
43
|
+
* proxy hostil ou um defeito do lado de lá derrubam o worker por memória sem
|
|
44
|
+
* jamais precisar de uma resposta válida. O teto é conferido enquanto os
|
|
45
|
+
* pedaços chegam — e não no fim —, porque conferir no fim significa já ter
|
|
46
|
+
* alocado o que se queria recusar.
|
|
47
|
+
*/
|
|
48
|
+
maxResponseBytes?: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* As opções que serão entregues ao socket, conferidas.
|
|
52
|
+
*
|
|
53
|
+
* Exportada porque o teste de regressão precisa exercitar a rejeição — um portão
|
|
54
|
+
* que só é conferido pela leitura do código não é um portão.
|
|
55
|
+
*/
|
|
56
|
+
export declare function assertNoTlsBypass(options: Record<string, unknown>): void;
|
|
57
|
+
export declare class HttpsFiscalTransport implements FiscalTransport {
|
|
58
|
+
readonly kind = "https";
|
|
59
|
+
private readonly agent;
|
|
60
|
+
private readonly servername;
|
|
61
|
+
/** Apresentamos certificado de cliente? Decide a leitura do reset abaixo. */
|
|
62
|
+
private readonly presentsClientCert;
|
|
63
|
+
private readonly maxResponseBytes;
|
|
64
|
+
constructor(options?: HttpsFiscalTransportOptions);
|
|
65
|
+
send(req: FiscalTransportRequest): Promise<FiscalTransportResponse>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Contexto do socket, para separar recusa de credencial de queda de rede.
|
|
69
|
+
*
|
|
70
|
+
* Ver o comentário longo em `send`: no TLS 1.3 os dois chegam como
|
|
71
|
+
* `ECONNRESET`, e sem estes três fatos não há como distingui-los.
|
|
72
|
+
*/
|
|
73
|
+
export interface TlsAttemptContext {
|
|
74
|
+
presentsClientCert: boolean;
|
|
75
|
+
handshakeCompleted: boolean;
|
|
76
|
+
bytesReceived: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Espera pedida por uma RESPOSTA (e não por um erro).
|
|
80
|
+
*
|
|
81
|
+
* Um `429` ou `503` com `Retry-After` é o servidor dizendo exatamente quando
|
|
82
|
+
* voltar. Ignorá-lo e aplicar o nosso backoff seria substituir a informação de
|
|
83
|
+
* quem sabe pela estimativa de quem não sabe.
|
|
84
|
+
*/
|
|
85
|
+
export declare function retryAfterOf(res: FiscalTransportResponse, now?: Date): Date | null;
|
|
86
|
+
//# sourceMappingURL=https.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"https.d.ts","sourceRoot":"","sources":["../../../src/fiscal/transport/https.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC7B,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,MAAM,WAAW,2BAA2B;IAC1C,gFAAgF;IAChF,GAAG,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC/B,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAyDD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWxE;AAED,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,OAAO,GAAE,2BAAgC;IAuC/C,IAAI,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAgI1E;AA0BD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAwCD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,uBAAuB,EAAE,GAAG,GAAE,IAAiB,GAAG,IAAI,GAAG,IAAI,CAE9F"}
|