@devix-tecnologia/assinatura-eletronica 0.0.0-stage → 0.5.1

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.
Files changed (72) hide show
  1. package/DEVELOPERS.md +123 -0
  2. package/LICENSE +21 -0
  3. package/README.md +141 -2
  4. package/dist/assinatura-orquestrador/assinatura-orquestrador.d.ts +12 -0
  5. package/dist/assinatura-orquestrador/assinatura-orquestrador.d.ts.map +1 -0
  6. package/dist/assinatura-orquestrador/assinatura-orquestrador.js +57 -0
  7. package/dist/assinatura-orquestrador/assinatura-orquestrador.js.map +1 -0
  8. package/dist/assinatura-orquestrador/assinatura-orquestrador.types.d.ts +14 -0
  9. package/dist/assinatura-orquestrador/assinatura-orquestrador.types.d.ts.map +1 -0
  10. package/dist/assinatura-orquestrador/assinatura-orquestrador.types.js +14 -0
  11. package/dist/assinatura-orquestrador/assinatura-orquestrador.types.js.map +1 -0
  12. package/dist/assinatura-orquestrador/index.d.ts +2 -0
  13. package/dist/assinatura-orquestrador/index.d.ts.map +1 -0
  14. package/dist/assinatura-orquestrador/index.js +2 -0
  15. package/dist/assinatura-orquestrador/index.js.map +1 -0
  16. package/dist/index.d.ts +10 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +5 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/layerall-policy/index.d.ts +2 -0
  21. package/dist/layerall-policy/index.d.ts.map +1 -0
  22. package/dist/layerall-policy/index.js +2 -0
  23. package/dist/layerall-policy/index.js.map +1 -0
  24. package/dist/layerall-policy/layerall-policy.d.ts +4 -0
  25. package/dist/layerall-policy/layerall-policy.d.ts.map +1 -0
  26. package/dist/layerall-policy/layerall-policy.js +28 -0
  27. package/dist/layerall-policy/layerall-policy.js.map +1 -0
  28. package/dist/layerall-policy/layerall-policy.types.d.ts +8 -0
  29. package/dist/layerall-policy/layerall-policy.types.d.ts.map +1 -0
  30. package/dist/layerall-policy/layerall-policy.types.js +8 -0
  31. package/dist/layerall-policy/layerall-policy.types.js.map +1 -0
  32. package/dist/observer/index.d.ts +4 -0
  33. package/dist/observer/index.d.ts.map +1 -0
  34. package/dist/observer/index.js +2 -0
  35. package/dist/observer/index.js.map +1 -0
  36. package/dist/observer/observer.d.ts +10 -0
  37. package/dist/observer/observer.d.ts.map +1 -0
  38. package/dist/observer/observer.js +70 -0
  39. package/dist/observer/observer.js.map +1 -0
  40. package/dist/observer/observer.types.d.ts +8 -0
  41. package/dist/observer/observer.types.d.ts.map +1 -0
  42. package/dist/observer/observer.types.js +2 -0
  43. package/dist/observer/observer.types.js.map +1 -0
  44. package/dist/provedor-assinatura/index.d.ts +3 -0
  45. package/dist/provedor-assinatura/index.d.ts.map +1 -0
  46. package/dist/provedor-assinatura/index.js +2 -0
  47. package/dist/provedor-assinatura/index.js.map +1 -0
  48. package/dist/provedor-assinatura/provedor-assinatura.contract.d.ts +24 -0
  49. package/dist/provedor-assinatura/provedor-assinatura.contract.d.ts.map +1 -0
  50. package/dist/provedor-assinatura/provedor-assinatura.contract.js +48 -0
  51. package/dist/provedor-assinatura/provedor-assinatura.contract.js.map +1 -0
  52. package/dist/provedor-assinatura/provedor-assinatura.mock.d.ts +5 -0
  53. package/dist/provedor-assinatura/provedor-assinatura.mock.d.ts.map +1 -0
  54. package/dist/provedor-assinatura/provedor-assinatura.mock.js +53 -0
  55. package/dist/provedor-assinatura/provedor-assinatura.mock.js.map +1 -0
  56. package/dist/provedor-assinatura/provedor-assinatura.types.d.ts +69 -0
  57. package/dist/provedor-assinatura/provedor-assinatura.types.d.ts.map +1 -0
  58. package/dist/provedor-assinatura/provedor-assinatura.types.js +2 -0
  59. package/dist/provedor-assinatura/provedor-assinatura.types.js.map +1 -0
  60. package/dist/provider-adapter/index.d.ts +3 -0
  61. package/dist/provider-adapter/index.d.ts.map +1 -0
  62. package/dist/provider-adapter/index.js +2 -0
  63. package/dist/provider-adapter/index.js.map +1 -0
  64. package/dist/provider-adapter/provider-adapter.d.ts +6 -0
  65. package/dist/provider-adapter/provider-adapter.d.ts.map +1 -0
  66. package/dist/provider-adapter/provider-adapter.js +30 -0
  67. package/dist/provider-adapter/provider-adapter.js.map +1 -0
  68. package/dist/provider-adapter/provider-adapter.types.d.ts +26 -0
  69. package/dist/provider-adapter/provider-adapter.types.d.ts.map +1 -0
  70. package/dist/provider-adapter/provider-adapter.types.js +2 -0
  71. package/dist/provider-adapter/provider-adapter.types.js.map +1 -0
  72. package/package.json +60 -3
package/DEVELOPERS.md ADDED
@@ -0,0 +1,123 @@
1
+ # Desenvolvendo um novo provedor de assinatura
2
+
3
+ Guia para implementar um provedor concreto (`IProvedorAssinatura`) e validá-lo
4
+ com os testes de contrato.
5
+
6
+ ## Estrutura esperada de um provider package
7
+
8
+ ```
9
+ packages/meu-provedor-client/
10
+ src/
11
+ meu-provedor-client/
12
+ meu-provedor-client.ts # class MeuProvedorClient implements IProvedorAssinatura
13
+ meu-provedor-client.types.ts # tipos específicos do provedor (config, responses)
14
+ meu-provedor-client.test.ts # testes unitários (mock) + testes de contrato
15
+ index.ts # barrel: só a API pública
16
+ index.ts # reexporta o barrel do módulo
17
+ package.json
18
+ tsconfig.json
19
+ tsconfig.build.json
20
+ vitest.config.ts
21
+ README.md
22
+ ```
23
+
24
+ ## Interface a implementar
25
+
26
+ ```typescript
27
+ import type {
28
+ IProvedorAssinatura,
29
+ DocumentoParaAssinar,
30
+ } from '@devix-tecnologia/assinatura-eletronica';
31
+
32
+ class MeuProvedorClient implements IProvedorAssinatura {
33
+ async enviarParaAssinatura(
34
+ documento: DocumentoParaAssinar
35
+ ): Promise<ResultadoEnvio>;
36
+ async obterDetalhes(idDoc: string): Promise<DetalhesDocumento>;
37
+ async cancelarDocumento(idDoc: string): Promise<void>;
38
+ normalizarWebhook(payload: unknown): EventoAssinatura;
39
+ }
40
+ ```
41
+
42
+ ### Contrato de cada método
43
+
44
+ **`enviarParaAssinatura`**
45
+ - Recebe um `DocumentoParaAssinar` com PDF em base64, lista de signatários, metadata
46
+ - Deve fazer upload/binário do PDF + criar lista de signatários + enviar para assinatura
47
+ - Retorna `ResultadoEnvio` com `provedorDocId` (ID único no provedor) e `linkAcompanhamento` opcional
48
+
49
+ **`obterDetalhes`**
50
+ - Recebe o `provedorDocId` retornado pelo envio
51
+ - Retorna `DetalhesDocumento` com `status` (string) e URLs de arquivo opcionais
52
+
53
+ **`cancelarDocumento`**
54
+ - Recebe o `provedorDocId`
55
+ - Deve cancelar o documento no provedor
56
+ - Resolve sem valor em caso de sucesso
57
+
58
+ **`normalizarWebhook`**
59
+ - Recebe o payload cru do webhook do provedor
60
+ - Retorna `EventoAssinatura` normalizado
61
+ - Os tipos de evento: `documento_finalizado`, `signatario_assinou`, `documento_cancelado`, `email_nao_entregue`, `outro`
62
+
63
+ ## Testes de contrato
64
+
65
+ O pacote exporta `createProvedorAssinaturaContractTests` que executa uma suite
66
+ de testes de conformidade da interface `IProvedorAssinatura`. Importe e execute
67
+ no `.test.ts` do seu provedor:
68
+
69
+ ```typescript
70
+ import { describe, it, expect, beforeEach } from 'vitest';
71
+ import { createProvedorAssinaturaContractTests } from '@devix-tecnologia/assinatura-eletronica/provedor-assinatura.contract';
72
+ import { MeuProvedorClient } from './meu-provedor-client.js';
73
+
74
+ const hasRealCredentials = !!process.env.MEU_PROVEDOR_TOKEN;
75
+
76
+ (hasRealCredentials ? describe : describe.skip)(
77
+ 'MeuProvedorClient contract (real API)',
78
+ () => {
79
+ createProvedorAssinaturaContractTests(
80
+ {
81
+ createProvider: () =>
82
+ new MeuProvedorClient({
83
+ token: process.env.MEU_PROVEDOR_TOKEN!,
84
+ sandbox: true,
85
+ }),
86
+ createDocument: () => ({
87
+ pdfBase64: 'dGVzdGU=',
88
+ signatarios: [{ nome: 'João Silva', email: 'joao@teste.com' }],
89
+ nome: 'Contrato Teste',
90
+ dataLimite: '2026-07-18',
91
+ sandbox: true,
92
+ idExterno: 'ext-001',
93
+ }),
94
+ },
95
+ { describe, it, beforeEach, expect }
96
+ );
97
+ }
98
+ );
99
+ ```
100
+
101
+ - Os testes de contrato são **skipados por padrão** (sem credenciais reais)
102
+ - Ative com `MEU_PROVEDOR_TOKEN=xxx pnpm test`
103
+ - Os testes garantem que a interface está corretamente implementada
104
+
105
+ ## Testes unitários (mock)
106
+
107
+ Além do contrato, mantenha testes unitários com o HTTP layer mockado para
108
+ cobrir comportamentos específicos do provedor:
109
+
110
+ - Mapeamento correto dos campos do `DocumentoParaAssinar` para a API do provedor
111
+ - Normalização de webhooks para cada tipo de evento
112
+ - Tratamento de erros e edge cases (payloads sem campos, timeout, etc.)
113
+ - Overrides por-signatário (se aplicável)
114
+
115
+ ## Convensões
116
+
117
+ - Segue o padrão de estrutura de módulos da Devix (`@devix-tecnologia/padroes`):
118
+ uma pasta kebab-case por classe, com `.ts`, `.types.ts`, `.test.ts` e `index.ts`
119
+ - Imports relativos com extensão `.js` (o pacote é ESM e compila com `nodenext`)
120
+ - O `index.ts` é **export-only** (sem lógica)
121
+ - O constructor deve usar um objeto de configuração tipado
122
+ - Dependa do núcleo por `workspace:^`; a versão de cada pacote é calculada pelo
123
+ `lerna version` a partir dos commits (ver `devdocs/README.md` na raiz)
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-2026 Devix Tecnologia Ltda
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,142 @@
1
- # Temporary Holding Version
1
+ # @devix-tecnologia/assinatura-eletronica
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Abstração unificada para provedores de assinatura eletrônica (ZapSign, D4Sign),
4
+ com orquestração multi-provedor (roteamento, retries, failover) sobre o SDK
5
+ [`@layerall/core`](https://github.com/sidartaveloso/layerall).
6
+
7
+ ## Instalação
8
+
9
+ ```bash
10
+ pnpm add @devix-tecnologia/assinatura-eletronica
11
+ ```
12
+
13
+ ## Uso básico
14
+
15
+ ```typescript
16
+ import {
17
+ AssinaturaOrquestrador,
18
+ criarObserverPadrao,
19
+ } from '@devix-tecnologia/assinatura-eletronica';
20
+ import { ZapsignClient } from '@devix-tecnologia/zapsign-client';
21
+
22
+ const provedor = new ZapsignClient({
23
+ apiToken: process.env.ZAPSIGN_TOKEN!,
24
+ sandbox: true,
25
+ });
26
+
27
+ const orquestrador = new AssinaturaOrquestrador(
28
+ provedor,
29
+ undefined,
30
+ criarObserverPadrao(console)
31
+ );
32
+
33
+ const resultado = await orquestrador.enviarParaAssinatura({
34
+ pdfBase64,
35
+ signatarios: [{ nome: 'Fulano', email: 'fulano@exemplo.com' }],
36
+ nome: 'Contrato',
37
+ dataLimite: '2026-12-31',
38
+ sandbox: true,
39
+ idExterno: 'contrato_123',
40
+ });
41
+
42
+ console.log(resultado.provedorDocId, resultado.linkAcompanhamento);
43
+ ```
44
+
45
+ ## API pública
46
+
47
+ ### Tipos de domínio
48
+
49
+ | Tipo | Descrição |
50
+ | ---------------------- | --------------------------------------------------------- |
51
+ | `IProvedorAssinatura` | Interface que todo provedor deve implementar |
52
+ | `DocumentoParaAssinar` | Dados do documento + lista de signatários |
53
+ | `ResultadoEnvio` | Retorno de `enviarParaAssinatura` |
54
+ | `DetalhesDocumento` | Retorno de `obterDetalhes` |
55
+ | `EventoAssinatura` | Evento normalizado de webhook |
56
+ | `Signatario` | Dados de um signatário (nome, email, telefone, overrides) |
57
+
58
+ ### AssinaturaOrquestrador
59
+
60
+ Orquestrador multi-provedor. Construtor:
61
+
62
+ ```typescript
63
+ new AssinaturaOrquestrador(
64
+ provedor: IProvedorAssinatura | IProvedorAssinatura[],
65
+ policy?: PolicyDocument,
66
+ observer?: Observer,
67
+ )
68
+ ```
69
+
70
+ | Método | Retorno |
71
+ | --------------------------------- | ---------------------------- |
72
+ | `enviarParaAssinatura(documento)` | `Promise<ResultadoEnvio>` |
73
+ | `obterDetalhes(idDoc)` | `Promise<DetalhesDocumento>` |
74
+ | `cancelarDocumento(idDoc)` | `Promise<void>` |
75
+ | `normalizarWebhook(payload)` | `EventoAssinatura` |
76
+
77
+ Lança `AggregateError` quando todos os provedores falham.
78
+
79
+ ### Multi-provedor com failover
80
+
81
+ ```typescript
82
+ import { ZapsignClient } from '@devix-tecnologia/zapsign-client';
83
+ import { D4SignClient } from '@devix-tecnologia/d4sign-client';
84
+
85
+ const orquestrador = new AssinaturaOrquestrador([
86
+ new ZapsignClient({ apiToken: process.env.ZAPSIGN_TOKEN!, sandbox: true }),
87
+ // new D4SignClient({ tokenAPI: ..., cryptKey: ..., cofreUUID: ..., sandbox: true }),
88
+ ]);
89
+ ```
90
+
91
+ ### Observer (logs estruturados)
92
+
93
+ ```typescript
94
+ import { criarObserverPadrao } from '@devix-tecnologia/assinatura-eletronica';
95
+ import type { Logger } from '@devix-tecnologia/utils';
96
+
97
+ const observer = criarObserverPadrao(logger, { prefixo: '[assinatura]' });
98
+ ```
99
+
100
+ Os eventos `onStart`/`onAttempt`/`onFinish` do LayerAll são traduzidos em logs
101
+ com contexto estruturado (requestId, provedor, tentativa, latência, erro).
102
+
103
+ ### Estratégias de seleção de provedor
104
+
105
+ A política padrão é `failover`. É possível customizar via `PolicyDocument`:
106
+
107
+ ```typescript
108
+ import type { PolicyDocument } from '@devix-tecnologia/assinatura-eletronica';
109
+
110
+ const policy: PolicyDocument = {
111
+ tenants: {
112
+ default: {
113
+ providers: ['ZapsignClient_0', 'D4SignClient_1'],
114
+ operations: {
115
+ create: {
116
+ strategy: 'failover',
117
+ failover: true,
118
+ retries: { max: 2, backoffMs: 300 },
119
+ timeoutMs: 10_000,
120
+ },
121
+ status: { strategy: 'round_robin' },
122
+ },
123
+ },
124
+ },
125
+ };
126
+ ```
127
+
128
+ Estratégias suportadas: `failover`, `round_robin`, `load_balance`, `most_fast`.
129
+
130
+ ## Provedores conhecidos
131
+
132
+ - **[@devix-tecnologia/zapsign-client](../zapsign-client)** — Integração com [ZapSign](https://zapsign.com.br)
133
+ - **[@devix-tecnologia/d4sign-client](../d4sign-client)** — Integração com [D4Sign](https://d4sign.com.br)
134
+
135
+ ## Para desenvolvedores de provedores
136
+
137
+ Veja [DEVELOPERS.md](./DEVELOPERS.md) — guia de implementação, contrato de testes
138
+ e estrutura do pacote.
139
+
140
+ ## Licença
141
+
142
+ MIT. Ver [LICENSE](./LICENSE).
@@ -0,0 +1,12 @@
1
+ import type { Observer, PolicyDocument } from '@layerall/core';
2
+ import type { DetalhesDocumento, DocumentoParaAssinar, EventoAssinatura, IProvedorAssinatura, ResultadoEnvio } from '../provedor-assinatura/provedor-assinatura.types.js';
3
+ export declare class AssinaturaOrquestrador {
4
+ private router;
5
+ private provedores;
6
+ constructor(provedor: IProvedorAssinatura | IProvedorAssinatura[], policy?: PolicyDocument, observer?: Observer);
7
+ enviarParaAssinatura(documento: DocumentoParaAssinar): Promise<ResultadoEnvio>;
8
+ obterDetalhes(idDoc: string): Promise<DetalhesDocumento>;
9
+ cancelarDocumento(idDoc: string): Promise<void>;
10
+ normalizarWebhook(payload: unknown): EventoAssinatura;
11
+ }
12
+ //# sourceMappingURL=assinatura-orquestrador.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assinatura-orquestrador.d.ts","sourceRoot":"","sources":["../../src/assinatura-orquestrador/assinatura-orquestrador.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAY,MAAM,gBAAgB,CAAC;AAMzE,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACf,MAAM,qDAAqD,CAAC;AAU7D,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAwB;IAE1C,YACE,QAAQ,EAAE,mBAAmB,GAAG,mBAAmB,EAAE,EACrD,MAAM,CAAC,EAAE,cAAc,EACvB,QAAQ,CAAC,EAAE,QAAQ,EAsBpB;IAEK,oBAAoB,CACxB,SAAS,EAAE,oBAAoB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAkBzB;IAEK,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiB7D;IAEK,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAepD;IAED,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAEpD;CACF"}
@@ -0,0 +1,57 @@
1
+ import { Router } from '@layerall/core';
2
+ import { criarPolicyDefault, mapearOperacao, } from '../layerall-policy/layerall-policy.js';
3
+ import { criarProviderLayerAll, obterIdProvedor, } from '../provider-adapter/provider-adapter.js';
4
+ export class AssinaturaOrquestrador {
5
+ router;
6
+ provedores;
7
+ constructor(provedor, policy, observer) {
8
+ this.provedores = Array.isArray(provedor) ? provedor : [provedor];
9
+ const providersMap = {};
10
+ const idsProvedores = [];
11
+ for (let i = 0; i < this.provedores.length; i++) {
12
+ const p = this.provedores[i];
13
+ const id = obterIdProvedor(p, i);
14
+ idsProvedores.push(id);
15
+ providersMap[id] = criarProviderLayerAll(p, id);
16
+ }
17
+ this.router = new Router({
18
+ providers: providersMap,
19
+ policy: policy ?? criarPolicyDefault(idsProvedores),
20
+ observer,
21
+ });
22
+ }
23
+ async enviarParaAssinatura(documento) {
24
+ const operacao = mapearOperacao('enviarParaAssinatura');
25
+ const result = await this.router.execute(operacao, {
26
+ externalId: documento.idExterno,
27
+ data: { operacao: 'enviarParaAssinatura', args: [documento] },
28
+ });
29
+ if (result.status === 'failed') {
30
+ throw new AggregateError([new Error(result.error?.message ?? 'Falha desconhecida')], 'Todos os provedores de assinatura falharam');
31
+ }
32
+ return result.result;
33
+ }
34
+ async obterDetalhes(idDoc) {
35
+ const operacao = mapearOperacao('obterDetalhes');
36
+ const result = await this.router.execute(operacao, {
37
+ data: { operacao: 'obterDetalhes', args: [idDoc] },
38
+ });
39
+ if (result.status === 'failed') {
40
+ throw new AggregateError([new Error(result.error?.message ?? 'Falha desconhecida')], 'Todos os provedores falharam ao obter detalhes');
41
+ }
42
+ return result.result;
43
+ }
44
+ async cancelarDocumento(idDoc) {
45
+ const operacao = mapearOperacao('cancelarDocumento');
46
+ const result = await this.router.execute(operacao, {
47
+ data: { operacao: 'cancelarDocumento', args: [idDoc] },
48
+ });
49
+ if (result.status === 'failed') {
50
+ throw new AggregateError([new Error(result.error?.message ?? 'Falha desconhecida')], 'Todos os provedores falharam ao cancelar documento');
51
+ }
52
+ }
53
+ normalizarWebhook(payload) {
54
+ return this.provedores[0].normalizarWebhook(payload);
55
+ }
56
+ }
57
+ //# sourceMappingURL=assinatura-orquestrador.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assinatura-orquestrador.js","sourceRoot":"","sources":["../../src/assinatura-orquestrador/assinatura-orquestrador.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export {};
2
+ /**
3
+ * AssinaturaOrquestrador é a porta de entrada unificada para envio de
4
+ * documentos a provedores de assinatura eletrônica.
5
+ *
6
+ * Delega a orquestração (failover, round-robin, load balance, most-fast)
7
+ * ao Router do LayerAll, aplicando a política configurada.
8
+ *
9
+ * @remarks
10
+ * - Construtor aceita um provedor único ou um array (para fallback).
11
+ * - `enviarParaAssinatura` retorna `AggregateError` quando todos falham.
12
+ * - `normalizarWebhook` sempre delega ao primeiro provedor da lista.
13
+ */
14
+ //# sourceMappingURL=assinatura-orquestrador.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assinatura-orquestrador.types.d.ts","sourceRoot":"","sources":["../../src/assinatura-orquestrador/assinatura-orquestrador.types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,14 @@
1
+ export {};
2
+ /**
3
+ * AssinaturaOrquestrador é a porta de entrada unificada para envio de
4
+ * documentos a provedores de assinatura eletrônica.
5
+ *
6
+ * Delega a orquestração (failover, round-robin, load balance, most-fast)
7
+ * ao Router do LayerAll, aplicando a política configurada.
8
+ *
9
+ * @remarks
10
+ * - Construtor aceita um provedor único ou um array (para fallback).
11
+ * - `enviarParaAssinatura` retorna `AggregateError` quando todos falham.
12
+ * - `normalizarWebhook` sempre delega ao primeiro provedor da lista.
13
+ */
14
+ //# sourceMappingURL=assinatura-orquestrador.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assinatura-orquestrador.types.js","sourceRoot":"","sources":["../../src/assinatura-orquestrador/assinatura-orquestrador.types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,2 @@
1
+ export { AssinaturaOrquestrador } from './assinatura-orquestrador.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/assinatura-orquestrador/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { AssinaturaOrquestrador } from './assinatura-orquestrador.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assinatura-orquestrador/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type { Logger } from '@devix-tecnologia/utils';
2
+ export type { Observer, OperationName, PolicyDocument } from '@layerall/core';
3
+ export { AssinaturaOrquestrador } from './assinatura-orquestrador/assinatura-orquestrador.js';
4
+ export { criarPolicyDefault, mapearOperacao, } from './layerall-policy/layerall-policy.js';
5
+ export { criarObserverPadrao } from './observer/observer.js';
6
+ export type { LoggerLike, ObserverOptions } from './observer/observer.types.js';
7
+ export type { DetalhesDocumento, DocumentoParaAssinar, EventoAssinatura, IProvedorAssinatura, ResultadoEnvio, Signatario, } from './provedor-assinatura/provedor-assinatura.types.js';
8
+ export { criarProviderLayerAll, obterIdProvedor, } from './provider-adapter/provider-adapter.js';
9
+ export type { DadosOperacao, ResultadoOperacao, } from './provider-adapter/provider-adapter.types.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEtD,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAC9F,OAAO,EACL,kBAAkB,EAClB,cAAc,GACf,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAChF,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,UAAU,GACX,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EACL,qBAAqB,EACrB,eAAe,GAChB,MAAM,wCAAwC,CAAC;AAChD,YAAY,EACV,aAAa,EACb,iBAAiB,GAClB,MAAM,8CAA8C,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { AssinaturaOrquestrador } from './assinatura-orquestrador/assinatura-orquestrador.js';
2
+ export { criarPolicyDefault, mapearOperacao, } from './layerall-policy/layerall-policy.js';
3
+ export { criarObserverPadrao } from './observer/observer.js';
4
+ export { criarProviderLayerAll, obterIdProvedor, } from './provider-adapter/provider-adapter.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAC9F,OAAO,EACL,kBAAkB,EAClB,cAAc,GACf,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAU7D,OAAO,EACL,qBAAqB,EACrB,eAAe,GAChB,MAAM,wCAAwC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { criarPolicyDefault, mapearOperacao } from './layerall-policy.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layerall-policy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { criarPolicyDefault, mapearOperacao } from './layerall-policy.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/layerall-policy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { OperationName, PolicyDocument } from '@layerall/core';
2
+ export declare function criarPolicyDefault(idsProvedores: string[]): PolicyDocument;
3
+ export declare function mapearOperacao(operacao: string): OperationName;
4
+ //# sourceMappingURL=layerall-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layerall-policy.d.ts","sourceRoot":"","sources":["../../src/layerall-policy/layerall-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAUpE,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,cAAc,CAgB1E;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAM9D"}
@@ -0,0 +1,28 @@
1
+ const MAPA_OPERACAO = {
2
+ enviarParaAssinatura: 'create',
3
+ obterDetalhes: 'status',
4
+ cancelarDocumento: 'cancel',
5
+ };
6
+ const OPERACOES_DOMINIO = Object.keys(MAPA_OPERACAO);
7
+ export function criarPolicyDefault(idsProvedores) {
8
+ const operacoes = Object.fromEntries(OPERACOES_DOMINIO.map((op) => [
9
+ MAPA_OPERACAO[op],
10
+ { strategy: 'failover', failover: true },
11
+ ]));
12
+ return {
13
+ tenants: {
14
+ default: {
15
+ providers: idsProvedores,
16
+ operations: operacoes,
17
+ },
18
+ },
19
+ };
20
+ }
21
+ export function mapearOperacao(operacao) {
22
+ const mapeada = MAPA_OPERACAO[operacao];
23
+ if (!mapeada) {
24
+ throw new Error(`Operação desconhecida: ${operacao}`);
25
+ }
26
+ return mapeada;
27
+ }
28
+ //# sourceMappingURL=layerall-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layerall-policy.js","sourceRoot":"","sources":["../../src/layerall-policy/layerall-policy.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAkC;IACnD,oBAAoB,EAAE,QAAQ;IAC9B,aAAa,EAAE,QAAQ;IACvB,iBAAiB,EAAE,QAAQ;CAC5B,CAAC;AAEF,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAErD,MAAM,UAAU,kBAAkB,CAAC,aAAuB;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAClC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;QAC5B,aAAa,CAAC,EAAE,CAAC;QACjB,EAAE,QAAQ,EAAE,UAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE;KAClD,CAAC,CACH,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,SAAS,EAAE,aAAa;gBACxB,UAAU,EAAE,SAAS;aACtB;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export {};
2
+ /**
3
+ * Mapeamento de operações de domínio para OperationName do LayerAll:
4
+ * - `enviarParaAssinatura` → `create`
5
+ * - `obterDetalhes` → `status`
6
+ * - `cancelarDocumento` → `cancel`
7
+ */
8
+ //# sourceMappingURL=layerall-policy.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layerall-policy.types.d.ts","sourceRoot":"","sources":["../../src/layerall-policy/layerall-policy.types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
@@ -0,0 +1,8 @@
1
+ export {};
2
+ /**
3
+ * Mapeamento de operações de domínio para OperationName do LayerAll:
4
+ * - `enviarParaAssinatura` → `create`
5
+ * - `obterDetalhes` → `status`
6
+ * - `cancelarDocumento` → `cancel`
7
+ */
8
+ //# sourceMappingURL=layerall-policy.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layerall-policy.types.js","sourceRoot":"","sources":["../../src/layerall-policy/layerall-policy.types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
@@ -0,0 +1,4 @@
1
+ export type { Logger } from '@devix-tecnologia/utils';
2
+ export { criarObserverPadrao } from './observer.js';
3
+ export type { LoggerLike, ObserverOptions } from './observer.types.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observer/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { criarObserverPadrao } from './observer.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/observer/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Logger } from '@devix-tecnologia/utils';
2
+ import type { Observer } from '@layerall/core';
3
+ import type { ObserverOptions } from './observer.types.js';
4
+ /**
5
+ * Cria um {@link Observer} do LayerAll que traduz os eventos de
6
+ * orquestração (`onStart`/`onAttempt`/`onFinish`) em logs estruturados,
7
+ * substituindo o log solto que existia antes nas factories/serviços.
8
+ */
9
+ export declare function criarObserverPadrao(logger?: Logger, opts?: ObserverOptions): Observer;
10
+ //# sourceMappingURL=observer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../src/observer/observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,GAAE,MAAgB,EACxB,IAAI,GAAE,eAAoB,GACzB,QAAQ,CAwEV"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Cria um {@link Observer} do LayerAll que traduz os eventos de
3
+ * orquestração (`onStart`/`onAttempt`/`onFinish`) em logs estruturados,
4
+ * substituindo o log solto que existia antes nas factories/serviços.
5
+ */
6
+ export function criarObserverPadrao(logger = console, opts = {}) {
7
+ const prefixo = opts.prefixo ?? '[assinatura]';
8
+ const emitir = (nivel, mensagem, dados) => {
9
+ const fn = logger[nivel] ?? logger.info;
10
+ if (!fn)
11
+ return;
12
+ const linha = dados
13
+ ? `${prefixo} ${mensagem} ${JSON.stringify(dados)}`
14
+ : `${prefixo} ${mensagem}`;
15
+ fn.call(logger, linha);
16
+ };
17
+ return {
18
+ onStart(ev) {
19
+ emitir('info', 'operação iniciada', {
20
+ requestId: ev.requestId,
21
+ operacao: ev.operation,
22
+ estrategia: ev.strategy,
23
+ });
24
+ },
25
+ onAttempt(log) {
26
+ if (log.ok) {
27
+ emitir('info', 'tentativa concluída', {
28
+ requestId: log.requestId,
29
+ operacao: log.operation,
30
+ provedor: log.provider,
31
+ tentativa: log.attempt,
32
+ latenciaMs: log.latencyMs,
33
+ });
34
+ return;
35
+ }
36
+ emitir('warn', 'tentativa falhou', {
37
+ requestId: log.requestId,
38
+ operacao: log.operation,
39
+ provedor: log.provider,
40
+ tentativa: log.attempt,
41
+ latenciaMs: log.latencyMs,
42
+ transiente: log.transient,
43
+ codigoErro: log.errorCode,
44
+ erro: log.error,
45
+ });
46
+ },
47
+ onFinish(res) {
48
+ if (res.status === 'succeeded') {
49
+ emitir('info', 'operação concluída', {
50
+ requestId: res.requestId,
51
+ operacao: res.operation,
52
+ provedor: res.provider,
53
+ tentativas: res.attempts,
54
+ latenciaMs: res.latencyMs,
55
+ receipt: res.providerReceipt,
56
+ });
57
+ return;
58
+ }
59
+ emitir('error', 'operação falhou em todos os provedores', {
60
+ requestId: res.requestId,
61
+ operacao: res.operation,
62
+ tentativas: res.attempts,
63
+ latenciaMs: res.latencyMs,
64
+ codigoErro: res.error?.code,
65
+ erro: res.error?.message,
66
+ });
67
+ },
68
+ };
69
+ }
70
+ //# sourceMappingURL=observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer.js","sourceRoot":"","sources":["../../src/observer/observer.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAM,GAAW,OAAO,EACxB,IAAI,GAAoB,EAAE;IAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC;IAE/C,MAAM,MAAM,GAAG,CACb,KAAgC,EAChC,QAAgB,EAChB,KAA+B,EACzB,EAAE;QACR,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC;QACxC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,KAAK,GAAG,KAAK;YACjB,CAAC,CAAC,GAAG,OAAO,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YACnD,CAAC,CAAC,GAAG,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,OAAO;QACL,OAAO,CAAC,EAAE;YACR,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE;gBAClC,SAAS,EAAE,EAAE,CAAC,SAAS;gBACvB,QAAQ,EAAE,EAAE,CAAC,SAAS;gBACtB,UAAU,EAAE,EAAE,CAAC,QAAQ;aACxB,CAAC,CAAC;QACL,CAAC;QAED,SAAS,CAAC,GAAG;YACX,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,CAAC,MAAM,EAAE,qBAAqB,EAAE;oBACpC,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,QAAQ,EAAE,GAAG,CAAC,SAAS;oBACvB,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,SAAS,EAAE,GAAG,CAAC,OAAO;oBACtB,UAAU,EAAE,GAAG,CAAC,SAAS;iBAC1B,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE;gBACjC,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,QAAQ,EAAE,GAAG,CAAC,SAAS;gBACvB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,SAAS,EAAE,GAAG,CAAC,OAAO;gBACtB,UAAU,EAAE,GAAG,CAAC,SAAS;gBACzB,UAAU,EAAE,GAAG,CAAC,SAAS;gBACzB,UAAU,EAAE,GAAG,CAAC,SAAS;gBACzB,IAAI,EAAE,GAAG,CAAC,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;QAED,QAAQ,CAAC,GAAG;YACV,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC/B,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE;oBACnC,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,QAAQ,EAAE,GAAG,CAAC,SAAS;oBACvB,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,UAAU,EAAE,GAAG,CAAC,QAAQ;oBACxB,UAAU,EAAE,GAAG,CAAC,SAAS;oBACzB,OAAO,EAAE,GAAG,CAAC,eAAe;iBAC7B,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,CAAC,OAAO,EAAE,wCAAwC,EAAE;gBACxD,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,QAAQ,EAAE,GAAG,CAAC,SAAS;gBACvB,UAAU,EAAE,GAAG,CAAC,QAAQ;gBACxB,UAAU,EAAE,GAAG,CAAC,SAAS;gBACzB,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI;gBAC3B,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO;aACzB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Logger } from '@devix-tecnologia/utils';
2
+ /** Alias para a interface Logger do utils, exportado para conveniência dos consumidores. */
3
+ export type LoggerLike = Logger;
4
+ export interface ObserverOptions {
5
+ /** Prefixo aplicado a todas as linhas de log. Default: `[assinatura]`. */
6
+ prefixo?: string;
7
+ }
8
+ //# sourceMappingURL=observer.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer.types.d.ts","sourceRoot":"","sources":["../../src/observer/observer.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEtD,4FAA4F;AAC5F,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=observer.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer.types.js","sourceRoot":"","sources":["../../src/observer/observer.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { criarProvedorQueFalha, criarProvedorStub, documentoPadrao, } from './provedor-assinatura.mock.js';
2
+ export type { DetalhesDocumento, DocumentoParaAssinar, EventoAssinatura, IProvedorAssinatura, ResultadoEnvio, Signatario, } from './provedor-assinatura.types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provedor-assinatura/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,GAChB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,UAAU,GACX,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { criarProvedorQueFalha, criarProvedorStub, documentoPadrao, } from './provedor-assinatura.mock.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provedor-assinatura/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,GAChB,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { DocumentoParaAssinar, IProvedorAssinatura } from './provedor-assinatura.types.js';
2
+ export interface ProvedorAssinaturaContractSuite {
3
+ createProvider: () => IProvedorAssinatura;
4
+ createDocument: () => DocumentoParaAssinar;
5
+ }
6
+ export interface AssercaoContrato {
7
+ toBeDefined(): void;
8
+ toBeTypeOf(type: string): void;
9
+ toBeGreaterThan(n: number): void;
10
+ toContain(item: unknown): void;
11
+ toEqual(expected: unknown): void;
12
+ toBe(expected: unknown): void;
13
+ resolves: {
14
+ toBeUndefined(): unknown;
15
+ };
16
+ }
17
+ export interface TestFramework {
18
+ describe(name: string, fn: () => void): void;
19
+ it(name: string, fn: () => Promise<void> | void): void;
20
+ beforeEach(fn: () => void): void;
21
+ expect(actual: unknown): AssercaoContrato;
22
+ }
23
+ export declare function createProvedorAssinaturaContractTests(suite: ProvedorAssinaturaContractSuite, t: TestFramework): void;
24
+ //# sourceMappingURL=provedor-assinatura.contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provedor-assinatura.contract.d.ts","sourceRoot":"","sources":["../../src/provedor-assinatura/provedor-assinatura.contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,+BAA+B;IAC9C,cAAc,EAAE,MAAM,mBAAmB,CAAC;IAC1C,cAAc,EAAE,MAAM,oBAAoB,CAAC;CAC5C;AAKD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,IAAI,IAAI,CAAC;IACpB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE;QAAE,aAAa,IAAI,OAAO,CAAA;KAAE,CAAC;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC7C,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IACvD,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAAC;CAC3C;AAED,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,+BAA+B,EACtC,CAAC,EAAE,aAAa,GACf,IAAI,CA6DN"}
@@ -0,0 +1,48 @@
1
+ export function createProvedorAssinaturaContractTests(suite, t) {
2
+ const { describe, it, beforeEach, expect } = t;
3
+ describe('IProvedorAssinatura contract', () => {
4
+ let provedor;
5
+ beforeEach(() => {
6
+ provedor = suite.createProvider();
7
+ });
8
+ it('deve retornar ResultadoEnvio ao enviar documento para assinatura', async () => {
9
+ const documento = suite.createDocument();
10
+ const resultado = await provedor.enviarParaAssinatura(documento);
11
+ expect(resultado).toBeDefined();
12
+ expect(resultado.provedorDocId).toBeTypeOf('string');
13
+ expect(resultado.provedorDocId.length).toBeGreaterThan(0);
14
+ });
15
+ it('deve obter detalhes do documento', async () => {
16
+ const documento = suite.createDocument();
17
+ const resultado = await provedor.enviarParaAssinatura(documento);
18
+ const detalhes = await provedor.obterDetalhes(resultado.provedorDocId);
19
+ expect(detalhes).toBeDefined();
20
+ expect(detalhes.status).toBeTypeOf('string');
21
+ });
22
+ it('deve cancelar documento', async () => {
23
+ const documento = suite.createDocument();
24
+ const resultado = await provedor.enviarParaAssinatura(documento);
25
+ await expect(provedor.cancelarDocumento(resultado.provedorDocId)).resolves.toBeUndefined();
26
+ });
27
+ it('deve normalizar webhook retornando EventoAssinatura valido', () => {
28
+ const evento = provedor.normalizarWebhook({ qualquer: 'payload' });
29
+ expect(evento).toBeDefined();
30
+ expect(evento.tipo).toBeTypeOf('string');
31
+ expect([
32
+ 'documento_finalizado',
33
+ 'signatario_assinou',
34
+ 'documento_cancelado',
35
+ 'email_nao_entregue',
36
+ 'outro',
37
+ ]).toContain(evento.tipo);
38
+ expect(evento.provedorDocId).toBeTypeOf('string');
39
+ expect(evento.raw).toBeDefined();
40
+ });
41
+ it('deve extrair provedorDocId do payload do webhook quando presente', () => {
42
+ const evento = provedor.normalizarWebhook({ id: 'doc-custom-123' });
43
+ expect(evento.provedorDocId).toBe('doc-custom-123');
44
+ expect(evento.raw).toEqual({ id: 'doc-custom-123' });
45
+ });
46
+ });
47
+ }
48
+ //# sourceMappingURL=provedor-assinatura.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provedor-assinatura.contract.js","sourceRoot":"","sources":["../../src/provedor-assinatura/provedor-assinatura.contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { DocumentoParaAssinar, IProvedorAssinatura } from './provedor-assinatura.types.js';
2
+ export declare function criarProvedorStub(): IProvedorAssinatura;
3
+ export declare function criarProvedorQueFalha(): IProvedorAssinatura;
4
+ export declare const documentoPadrao: DocumentoParaAssinar;
5
+ //# sourceMappingURL=provedor-assinatura.mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provedor-assinatura.mock.d.ts","sourceRoot":"","sources":["../../src/provedor-assinatura/provedor-assinatura.mock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,gCAAgC,CAAC;AAExC,wBAAgB,iBAAiB,IAAI,mBAAmB,CA8BvD;AAED,wBAAgB,qBAAqB,IAAI,mBAAmB,CAW3D;AAED,eAAO,MAAM,eAAe,EAAE,oBAO7B,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { vi } from 'vitest';
2
+ export function criarProvedorStub() {
3
+ let contadorStub = 0;
4
+ return {
5
+ async enviarParaAssinatura() {
6
+ contadorStub++;
7
+ return {
8
+ provedorDocId: `doc-stub-${String(contadorStub).padStart(3, '0')}`,
9
+ linkAcompanhamento: `https://stub.assinatura.com/doc/${contadorStub}`,
10
+ rawResponse: { stub: true },
11
+ };
12
+ },
13
+ async obterDetalhes(idDoc) {
14
+ return {
15
+ status: 'signed',
16
+ originalFileUrl: `https://stub.assinatura.com/doc/${idDoc}/original`,
17
+ signedFileUrl: `https://stub.assinatura.com/doc/${idDoc}/signed`,
18
+ };
19
+ },
20
+ async cancelarDocumento() {
21
+ return;
22
+ },
23
+ normalizarWebhook(payload) {
24
+ const body = payload;
25
+ return {
26
+ tipo: 'documento_finalizado',
27
+ provedorDocId: String(body?.id ?? 'doc-stub-001'),
28
+ raw: payload,
29
+ };
30
+ },
31
+ };
32
+ }
33
+ export function criarProvedorQueFalha() {
34
+ return {
35
+ enviarParaAssinatura: vi
36
+ .fn()
37
+ .mockRejectedValue(new Error('Falha no provedor')),
38
+ obterDetalhes: vi.fn().mockRejectedValue(new Error('Falha no provedor')),
39
+ cancelarDocumento: vi
40
+ .fn()
41
+ .mockRejectedValue(new Error('Falha no provedor')),
42
+ normalizarWebhook: vi.fn(),
43
+ };
44
+ }
45
+ export const documentoPadrao = {
46
+ pdfBase64: 'dGVzdGU=',
47
+ signatarios: [{ nome: 'João Silva', email: 'joao@teste.com' }],
48
+ nome: 'Contrato Teste',
49
+ dataLimite: '2026-07-18',
50
+ sandbox: true,
51
+ idExterno: 'ext-001',
52
+ };
53
+ //# sourceMappingURL=provedor-assinatura.mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provedor-assinatura.mock.js","sourceRoot":"","sources":["../../src/provedor-assinatura/provedor-assinatura.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAM5B,MAAM,UAAU,iBAAiB;IAC/B,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,OAAO;QACL,KAAK,CAAC,oBAAoB;YACxB,YAAY,EAAE,CAAC;YACf,OAAO;gBACL,aAAa,EAAE,YAAY,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;gBAClE,kBAAkB,EAAE,mCAAmC,YAAY,EAAE;gBACrE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;aAC5B,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,KAAK;YACvB,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,eAAe,EAAE,mCAAmC,KAAK,WAAW;gBACpE,aAAa,EAAE,mCAAmC,KAAK,SAAS;aACjE,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,iBAAiB;YACrB,OAAO;QACT,CAAC;QACD,iBAAiB,CAAC,OAAO;YACvB,MAAM,IAAI,GAAG,OAAkC,CAAC;YAChD,OAAO;gBACL,IAAI,EAAE,sBAAsB;gBAC5B,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,cAAc,CAAC;gBACjD,GAAG,EAAE,OAAO;aACb,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,oBAAoB,EAAE,EAAE;aACrB,EAAE,EAAE;aACJ,iBAAiB,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACpD,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACxE,iBAAiB,EAAE,EAAE;aAClB,EAAE,EAAE;aACJ,iBAAiB,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACpD,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAyB;IACnD,SAAS,EAAE,UAAU;IACrB,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC9D,IAAI,EAAE,gBAAgB;IACtB,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,SAAS;CACrB,CAAC"}
@@ -0,0 +1,69 @@
1
+ export interface Signatario {
2
+ nome: string;
3
+ email: string;
4
+ telefone?: string;
5
+ mensagemPersonalizada?: string;
6
+ /** Envia e-mail automático de convite a ESTE signatário (API ZapSign: send_automatic_email). */
7
+ sendAutomaticEmail?: boolean;
8
+ /** Envia convite por WhatsApp a ESTE signatário (API ZapSign: send_automatic_whatsapp). */
9
+ sendAutomaticWhatsapp?: boolean;
10
+ /** Impede ESTE signatário de editar o e-mail (API ZapSign: lock_email). */
11
+ lockEmail?: boolean;
12
+ /** Impede ESTE signatário de editar o telefone (API ZapSign: lock_phone). */
13
+ lockPhone?: boolean;
14
+ /** Exige selfie DESTE signatário (API ZapSign: require_selfie_photo). */
15
+ requireSelfie?: boolean;
16
+ /** Exige foto do documento DESTE signatário (API ZapSign: require_document_photo). */
17
+ requireDocumentPhoto?: boolean;
18
+ /** Modo de autenticação DESTE signatário (API ZapSign: auth_mode). */
19
+ authMode?: string;
20
+ }
21
+ export interface DocumentoParaAssinar {
22
+ pdfBase64: string;
23
+ signatarios: Signatario[];
24
+ nome: string;
25
+ /** Data-limite para assinar (YYYY-MM-DD). Opcional: quando ausente, o provedor não envia limite. */
26
+ dataLimite?: string;
27
+ sandbox: boolean;
28
+ idExterno: string;
29
+ /** Envia e-mail automático de convite aos signatários (API ZapSign: send_automatic_email). */
30
+ sendAutomaticEmail?: boolean;
31
+ /** Envia convite por WhatsApp aos signatários (API ZapSign: send_automatic_whatsapp). */
32
+ sendAutomaticWhatsapp?: boolean;
33
+ /** Impede o signatário de editar o e-mail (API ZapSign: lock_email). */
34
+ lockEmail?: boolean;
35
+ /** Impede o signatário de editar o telefone (API ZapSign: lock_phone). */
36
+ lockPhone?: boolean;
37
+ /** Exige selfie do signatário (API ZapSign: require_selfie_photo). */
38
+ requireSelfie?: boolean;
39
+ /** Exige foto do documento do signatário (API ZapSign: require_document_photo). */
40
+ requireDocumentPhoto?: boolean;
41
+ metadata?: Record<string, unknown>;
42
+ }
43
+ export interface ResultadoEnvio {
44
+ provedorDocId: string;
45
+ linkAcompanhamento?: string;
46
+ rawResponse: unknown;
47
+ }
48
+ export interface DetalhesDocumento {
49
+ status: string;
50
+ originalFileUrl?: string;
51
+ signedFileUrl?: string;
52
+ }
53
+ export interface EventoAssinatura {
54
+ tipo: 'documento_finalizado' | 'signatario_assinou' | 'documento_cancelado' | 'email_nao_entregue' | 'outro';
55
+ provedorDocId: string;
56
+ /** ID externo do documento no sistema consumidor (ex.: contrato_123). Preenchido quando o provedor o envia. */
57
+ idExterno?: string;
58
+ /** URL do arquivo assinado, quando o evento a traz (ex.: doc finalizado). */
59
+ signedFileUrl?: string;
60
+ signatario?: Signatario;
61
+ raw: unknown;
62
+ }
63
+ export interface IProvedorAssinatura {
64
+ enviarParaAssinatura(documento: DocumentoParaAssinar): Promise<ResultadoEnvio>;
65
+ obterDetalhes(idDoc: string): Promise<DetalhesDocumento>;
66
+ cancelarDocumento(idDoc: string): Promise<void>;
67
+ normalizarWebhook(payload: unknown): EventoAssinatura;
68
+ }
69
+ //# sourceMappingURL=provedor-assinatura.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provedor-assinatura.types.d.ts","sourceRoot":"","sources":["../../src/provedor-assinatura/provedor-assinatura.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gGAAgG;IAChG,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,2FAA2F;IAC3F,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yEAAyE;IACzE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sFAAsF;IACtF,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,oGAAoG;IACpG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,8FAA8F;IAC9F,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,yFAAyF;IACzF,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mFAAmF;IACnF,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EACA,sBAAsB,GACtB,oBAAoB,GACpB,qBAAqB,GACrB,oBAAoB,GACpB,OAAO,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,+GAA+G;IAC/G,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,oBAAoB,CAClB,SAAS,EAAE,oBAAoB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzD,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAAC;CACvD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provedor-assinatura.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provedor-assinatura.types.js","sourceRoot":"","sources":["../../src/provedor-assinatura/provedor-assinatura.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { criarProviderLayerAll, obterIdProvedor } from './provider-adapter.js';
2
+ export type { DadosOperacao, OperacaoAssinatura, PropriedadesProvedor, ResultadoOperacao, } from './provider-adapter.types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provider-adapter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC/E,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { criarProviderLayerAll, obterIdProvedor } from './provider-adapter.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provider-adapter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Provider as LayerAllProvider } from '@layerall/core';
2
+ import type { IProvedorAssinatura } from '../provedor-assinatura/provedor-assinatura.types.js';
3
+ import type { DadosOperacao, PropriedadesProvedor, ResultadoOperacao } from './provider-adapter.types.js';
4
+ export declare function criarProviderLayerAll(provedor: IProvedorAssinatura, idProvedor?: string, propriedades?: PropriedadesProvedor): LayerAllProvider<DadosOperacao, ResultadoOperacao>;
5
+ export declare function obterIdProvedor(provedor: IProvedorAssinatura, indice: number): string;
6
+ //# sourceMappingURL=provider-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-adapter.d.ts","sourceRoot":"","sources":["../../src/provider-adapter/provider-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,QAAQ,IAAI,gBAAgB,EAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qDAAqD,CAAC;AAC/F,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAErC,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,mBAAmB,EAC7B,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,oBAAoB,GAClC,gBAAgB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAyBpD;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,mBAAmB,EAC7B,MAAM,EAAE,MAAM,GACb,MAAM,CAIR"}
@@ -0,0 +1,30 @@
1
+ export function criarProviderLayerAll(provedor, idProvedor, propriedades) {
2
+ return {
3
+ id: idProvedor ?? provedor.constructor.name ?? 'provider',
4
+ ...propriedades,
5
+ async invoke(ctx) {
6
+ const { operacao, args } = ctx.payload.data;
7
+ switch (operacao) {
8
+ case 'enviarParaAssinatura':
9
+ return provedor.enviarParaAssinatura(args[0]);
10
+ case 'obterDetalhes':
11
+ return provedor.obterDetalhes(args[0]);
12
+ case 'cancelarDocumento':
13
+ return provedor.cancelarDocumento(args[0]);
14
+ default:
15
+ throw {
16
+ code: 'operacao_invalida',
17
+ message: `Operação desconhecida: ${operacao}`,
18
+ transient: false,
19
+ };
20
+ }
21
+ },
22
+ };
23
+ }
24
+ export function obterIdProvedor(provedor, indice) {
25
+ const nome = provedor.constructor.name;
26
+ if (!nome || nome === 'Object')
27
+ return `provider_${indice}`;
28
+ return `${nome}_${indice}`;
29
+ }
30
+ //# sourceMappingURL=provider-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-adapter.js","sourceRoot":"","sources":["../../src/provider-adapter/provider-adapter.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,qBAAqB,CACnC,QAA6B,EAC7B,UAAmB,EACnB,YAAmC;IAEnC,OAAO;QACL,EAAE,EAAE,UAAU,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,UAAU;QACzD,GAAG,YAAY;QACf,KAAK,CAAC,MAAM,CACV,GAAiC;YAEjC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YAE5C,QAAQ,QAAQ,EAAE,CAAC;gBACjB,KAAK,sBAAsB;oBACzB,OAAO,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,KAAK,eAAe;oBAClB,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzC,KAAK,mBAAmB;oBACtB,OAAO,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C;oBACE,MAAM;wBACJ,IAAI,EAAE,mBAAmB;wBACzB,OAAO,EAAE,0BAA0B,QAAQ,EAAE;wBAC7C,SAAS,EAAE,KAAK;qBACjB,CAAC;YACN,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,QAA6B,EAC7B,MAAc;IAEd,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;IACvC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,YAAY,MAAM,EAAE,CAAC;IAC5D,OAAO,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { DetalhesDocumento, DocumentoParaAssinar, ResultadoEnvio } from '../provedor-assinatura/provedor-assinatura.types.js';
2
+ /** Operações de domínio expostas ao LayerAll. */
3
+ export type OperacaoAssinatura = 'enviarParaAssinatura' | 'obterDetalhes' | 'cancelarDocumento';
4
+ /** Payload de entrada de cada operação. */
5
+ export type DadosOperacao = {
6
+ operacao: 'enviarParaAssinatura';
7
+ args: [DocumentoParaAssinar];
8
+ } | {
9
+ operacao: 'obterDetalhes';
10
+ args: [string];
11
+ } | {
12
+ operacao: 'cancelarDocumento';
13
+ args: [string];
14
+ };
15
+ /** Resultado de cada operação. */
16
+ export type ResultadoOperacao = ResultadoEnvio | DetalhesDocumento | void;
17
+ /** Propriedades opcionais de um provedor para o LayerAll (peso, capacidade, saúde etc.). */
18
+ export type PropriedadesProvedor = {
19
+ weight?: number;
20
+ capacity?: number;
21
+ enabled?: boolean;
22
+ health?: number;
23
+ baseLatency?: number;
24
+ failRate?: number;
25
+ };
26
+ //# sourceMappingURL=provider-adapter.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-adapter.types.d.ts","sourceRoot":"","sources":["../../src/provider-adapter/provider-adapter.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACf,MAAM,qDAAqD,CAAC;AAE7D,iDAAiD;AACjD,MAAM,MAAM,kBAAkB,GAC1B,sBAAsB,GACtB,eAAe,GACf,mBAAmB,CAAC;AAExB,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,EAAE,sBAAsB,CAAC;IAAC,IAAI,EAAE,CAAC,oBAAoB,CAAC,CAAA;CAAE,GAClE;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAA;CAAE,GAC7C;IAAE,QAAQ,EAAE,mBAAmB,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAEtD,kCAAkC;AAElC,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,iBAAiB,GAAG,IAAI,CAAC;AAE1E,4FAA4F;AAC5F,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider-adapter.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-adapter.types.js","sourceRoot":"","sources":["../../src/provider-adapter/provider-adapter.types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,63 @@
1
1
  {
2
2
  "name": "@devix-tecnologia/assinatura-eletronica",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.5.1",
4
+ "description": "Abstração unificada para provedores de assinatura eletrônica",
5
+ "keywords": [
6
+ "assinatura",
7
+ "zapsign",
8
+ "d4sign",
9
+ "eletronica"
10
+ ],
11
+ "license": "MIT",
12
+ "author": "Devix Tecnologia Ltda <contato@devix.co> (https://devix.co)",
13
+ "type": "module",
14
+ "main": "dist/index.js",
15
+ "types": "dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js",
20
+ "default": "./dist/index.js"
21
+ },
22
+ "./provedor-assinatura.contract": {
23
+ "types": "./dist/provedor-assinatura/provedor-assinatura.contract.d.ts",
24
+ "import": "./dist/provedor-assinatura/provedor-assinatura.contract.js",
25
+ "default": "./dist/provedor-assinatura/provedor-assinatura.contract.js"
26
+ }
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "README.md",
31
+ "DEVELOPERS.md",
32
+ "LICENSE"
33
+ ],
34
+ "publishConfig": {
35
+ "registry": "https://registry.npmjs.org/",
36
+ "@devix-tecnologia:registry": "https://registry.npmjs.org/",
37
+ "access": "public"
38
+ },
39
+ "dependencies": {
40
+ "@devix-tecnologia/utils": "^0.2.0",
41
+ "@layerall/core": "^2.1.0"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^24.13.5",
45
+ "typescript": "^7.0.2",
46
+ "vitest": "^5.0.1"
47
+ },
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "git+https://github.com/devix-tecnologia/assinatura-eletronica.git",
51
+ "directory": "packages/assinatura-eletronica"
52
+ },
53
+ "scripts": {
54
+ "build": "tsc -p tsconfig.build.json",
55
+ "clean": "rm -rf dist coverage tsconfig.tsbuildinfo",
56
+ "dev": "tsc -p tsconfig.build.json --watch",
57
+ "format": "biome check --write .",
58
+ "lint": "biome check . --error-on-warnings",
59
+ "test": "vitest --run",
60
+ "test:watch": "vitest --watch",
61
+ "typecheck": "tsc --noEmit"
62
+ }
6
63
  }