@radardata/sdk 0.0.0-stage → 0.1.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.
Files changed (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -2
  3. package/dist/cjs/configuracao.js +28 -0
  4. package/dist/cjs/configuracao.js.map +1 -0
  5. package/dist/cjs/dados.js +44 -0
  6. package/dist/cjs/dados.js.map +1 -0
  7. package/dist/cjs/erros.js +86 -0
  8. package/dist/cjs/erros.js.map +1 -0
  9. package/dist/cjs/index.js +69 -0
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/cjs/package.json +1 -0
  12. package/dist/cjs/recursos/analises.js +53 -0
  13. package/dist/cjs/recursos/analises.js.map +1 -0
  14. package/dist/cjs/recursos/catalogo.js +21 -0
  15. package/dist/cjs/recursos/catalogo.js.map +1 -0
  16. package/dist/cjs/recursos/consultas.js +33 -0
  17. package/dist/cjs/recursos/consultas.js.map +1 -0
  18. package/dist/cjs/recursos/verify.js +39 -0
  19. package/dist/cjs/recursos/verify.js.map +1 -0
  20. package/dist/cjs/recursos/webhooks.js +45 -0
  21. package/dist/cjs/recursos/webhooks.js.map +1 -0
  22. package/dist/cjs/transporte.js +128 -0
  23. package/dist/cjs/transporte.js.map +1 -0
  24. package/dist/cjs/webhooks/assinatura.js +65 -0
  25. package/dist/cjs/webhooks/assinatura.js.map +1 -0
  26. package/dist/esm/configuracao.d.ts +27 -0
  27. package/dist/esm/configuracao.d.ts.map +1 -0
  28. package/dist/esm/configuracao.js +23 -0
  29. package/dist/esm/configuracao.js.map +1 -0
  30. package/dist/esm/dados.d.ts +59 -0
  31. package/dist/esm/dados.d.ts.map +1 -0
  32. package/dist/esm/dados.js +38 -0
  33. package/dist/esm/dados.js.map +1 -0
  34. package/dist/esm/erros.d.ts +53 -0
  35. package/dist/esm/erros.d.ts.map +1 -0
  36. package/dist/esm/erros.js +73 -0
  37. package/dist/esm/erros.js.map +1 -0
  38. package/dist/esm/index.d.ts +41 -0
  39. package/dist/esm/index.d.ts.map +1 -0
  40. package/dist/esm/index.js +47 -0
  41. package/dist/esm/index.js.map +1 -0
  42. package/dist/esm/recursos/analises.d.ts +25 -0
  43. package/dist/esm/recursos/analises.d.ts.map +1 -0
  44. package/dist/esm/recursos/analises.js +49 -0
  45. package/dist/esm/recursos/analises.js.map +1 -0
  46. package/dist/esm/recursos/catalogo.d.ts +11 -0
  47. package/dist/esm/recursos/catalogo.d.ts.map +1 -0
  48. package/dist/esm/recursos/catalogo.js +17 -0
  49. package/dist/esm/recursos/catalogo.js.map +1 -0
  50. package/dist/esm/recursos/consultas.d.ts +22 -0
  51. package/dist/esm/recursos/consultas.d.ts.map +1 -0
  52. package/dist/esm/recursos/consultas.js +29 -0
  53. package/dist/esm/recursos/consultas.js.map +1 -0
  54. package/dist/esm/recursos/verify.d.ts +25 -0
  55. package/dist/esm/recursos/verify.d.ts.map +1 -0
  56. package/dist/esm/recursos/verify.js +35 -0
  57. package/dist/esm/recursos/verify.js.map +1 -0
  58. package/dist/esm/recursos/webhooks.d.ts +27 -0
  59. package/dist/esm/recursos/webhooks.d.ts.map +1 -0
  60. package/dist/esm/recursos/webhooks.js +41 -0
  61. package/dist/esm/recursos/webhooks.js.map +1 -0
  62. package/dist/esm/transporte.d.ts +35 -0
  63. package/dist/esm/transporte.d.ts.map +1 -0
  64. package/dist/esm/transporte.js +123 -0
  65. package/dist/esm/transporte.js.map +1 -0
  66. package/dist/esm/webhooks/assinatura.d.ts +32 -0
  67. package/dist/esm/webhooks/assinatura.d.ts.map +1 -0
  68. package/dist/esm/webhooks/assinatura.js +61 -0
  69. package/dist/esm/webhooks/assinatura.js.map +1 -0
  70. package/package.json +46 -4
  71. package/src/configuracao.ts +50 -0
  72. package/src/dados.ts +93 -0
  73. package/src/erros.ts +70 -0
  74. package/src/index.ts +66 -0
  75. package/src/recursos/analises.ts +61 -0
  76. package/src/recursos/catalogo.ts +17 -0
  77. package/src/recursos/consultas.ts +32 -0
  78. package/src/recursos/verify.ts +40 -0
  79. package/src/recursos/webhooks.ts +43 -0
  80. package/src/transporte.ts +145 -0
  81. package/src/webhooks/assinatura.ts +72 -0
@@ -0,0 +1,47 @@
1
+ import { resolver } from "./configuracao.js";
2
+ import { Analises } from "./recursos/analises.js";
3
+ import { Catalogo } from "./recursos/catalogo.js";
4
+ import { Consultas } from "./recursos/consultas.js";
5
+ import { Verify } from "./recursos/verify.js";
6
+ import { Webhooks } from "./recursos/webhooks.js";
7
+ import { Transporte } from "./transporte.js";
8
+ /**
9
+ * Ponto de entrada do SDK.
10
+ *
11
+ * ```ts
12
+ * import { RadarData } from "@radardata/sdk";
13
+ *
14
+ * const radar = new RadarData({ token: process.env.RADARDATA_TOKEN! });
15
+ * const saldo = await radar.catalogo.saldo();
16
+ * ```
17
+ *
18
+ * O token e o de API, criado no painel, e NAO o de sessao do painel. Ele
19
+ * carrega escopos: uma chamada fora do escopo do token volta `SemEscopo`, e
20
+ * isso e proposital, para um token de servidor nao poder redirecionar os seus
21
+ * webhooks.
22
+ */
23
+ export class RadarData {
24
+ catalogo;
25
+ consultas;
26
+ verify;
27
+ analises;
28
+ webhooks;
29
+ constructor(config) {
30
+ const t = new Transporte(resolver(config));
31
+ this.catalogo = new Catalogo(t);
32
+ this.consultas = new Consultas(t);
33
+ this.verify = new Verify(t);
34
+ this.analises = new Analises(t);
35
+ this.webhooks = new Webhooks(t);
36
+ }
37
+ }
38
+ export { chaveIdempotencia } from "./transporte.js";
39
+ export { confereAssinatura, exigirAssinatura } from "./webhooks/assinatura.js";
40
+ export { emReais } from "./dados.js";
41
+ export { EntradaInvalida, ErroDoServidor, ErroRadarData, FalhaDeRede, MuitasTentativas, NaoAutenticado, NaoEncontrado, SaldoInsuficiente, SemEscopo, } from "./erros.js";
42
+ export { Analises } from "./recursos/analises.js";
43
+ export { Catalogo } from "./recursos/catalogo.js";
44
+ export { Consultas } from "./recursos/consultas.js";
45
+ export { Verify } from "./recursos/verify.js";
46
+ export { Webhooks } from "./recursos/webhooks.js";
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,SAAS;IACX,QAAQ,CAAW;IAEnB,SAAS,CAAY;IAErB,MAAM,CAAS;IAEf,QAAQ,CAAW;IAEnB,QAAQ,CAAW;IAE5B,YAAY,MAAoB;QAC9B,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAE3C,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;CACF;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type Transporte } from "../transporte.js";
2
+ /**
3
+ * Motor de Analises. Escopo `analises`. GASTA SALDO.
4
+ *
5
+ * E ASSINCRONO: criar devolve o id e o resultado chega por webhook. Consultar
6
+ * em laco funciona, mas o webhook e o caminho previsto; veja
7
+ * `confereAssinatura` para conferir que o aviso e nosso.
8
+ *
9
+ * Um 404 aqui pode querer dizer "o Motor nao esta liberado para a sua conta",
10
+ * e nao "caminho errado": enquanto ele nao esta liberado, nada dele aparece
11
+ * para o cliente, de proposito.
12
+ */
13
+ export declare class Analises {
14
+ private readonly t;
15
+ constructor(t: Transporte);
16
+ /** Produtos liberados para esta conta. */
17
+ produtos(): Promise<Record<string, unknown>[]>;
18
+ criar(slug: string, campos: Record<string, unknown>, opcoes?: Record<string, unknown>, chave?: string): Promise<Record<string, unknown>>;
19
+ mostrar(id: string): Promise<Record<string, unknown>>;
20
+ decidir(id: string, decisao: string, motivo?: string): Promise<Record<string, unknown>>;
21
+ monitorar(slug: string, campos: Record<string, unknown>, opcoes?: Record<string, unknown>): Promise<Record<string, unknown>>;
22
+ monitoramentos(): Promise<Record<string, unknown>[]>;
23
+ cancelarMonitoramento(id: string): Promise<Record<string, unknown>>;
24
+ }
25
+ //# sourceMappingURL=analises.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analises.d.ts","sourceRoot":"","sources":["../../../src/recursos/analises.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,kBAAkB,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,UAAU;IAE1C,0CAA0C;IACpC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAI9C,KAAK,CACT,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACpC,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAO7B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIrD,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMvF,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAM7B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAIpD,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAG1E"}
@@ -0,0 +1,49 @@
1
+ import { chaveIdempotencia } from "../transporte.js";
2
+ /**
3
+ * Motor de Analises. Escopo `analises`. GASTA SALDO.
4
+ *
5
+ * E ASSINCRONO: criar devolve o id e o resultado chega por webhook. Consultar
6
+ * em laco funciona, mas o webhook e o caminho previsto; veja
7
+ * `confereAssinatura` para conferir que o aviso e nosso.
8
+ *
9
+ * Um 404 aqui pode querer dizer "o Motor nao esta liberado para a sua conta",
10
+ * e nao "caminho errado": enquanto ele nao esta liberado, nada dele aparece
11
+ * para o cliente, de proposito.
12
+ */
13
+ export class Analises {
14
+ t;
15
+ constructor(t) {
16
+ this.t = t;
17
+ }
18
+ /** Produtos liberados para esta conta. */
19
+ async produtos() {
20
+ return this.t.pedir("GET", "analises/produtos");
21
+ }
22
+ async criar(slug, campos, opcoes = {}, chave) {
23
+ return this.t.pedir("POST", `analises/${encodeURIComponent(slug)}`, {
24
+ corpo: { campos, ...opcoes },
25
+ chaveIdempotencia: chave ?? chaveIdempotencia(),
26
+ });
27
+ }
28
+ async mostrar(id) {
29
+ return this.t.pedir("GET", `analises/${encodeURIComponent(id)}`);
30
+ }
31
+ async decidir(id, decisao, motivo) {
32
+ const corpo = { decisao };
33
+ if (motivo !== undefined)
34
+ corpo.motivo = motivo;
35
+ return this.t.pedir("POST", `analises/${encodeURIComponent(id)}/decisao`, { corpo });
36
+ }
37
+ async monitorar(slug, campos, opcoes = {}) {
38
+ return this.t.pedir("POST", `analises/monitorar/${encodeURIComponent(slug)}`, {
39
+ corpo: { campos, ...opcoes },
40
+ });
41
+ }
42
+ async monitoramentos() {
43
+ return this.t.pedir("GET", "analises/monitoramentos");
44
+ }
45
+ async cancelarMonitoramento(id) {
46
+ return this.t.pedir("DELETE", `analises/monitoramentos/${encodeURIComponent(id)}`);
47
+ }
48
+ }
49
+ //# sourceMappingURL=analises.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analises.js","sourceRoot":"","sources":["../../../src/recursos/analises.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,MAAM,OAAO,QAAQ;IACU;IAA7B,YAA6B,CAAa;QAAb,MAAC,GAAD,CAAC,CAAY;IAAG,CAAC;IAE9C,0CAA0C;IAC1C,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAA4B,KAAK,EAAE,mBAAmB,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,KAAK,CACT,IAAY,EACZ,MAA+B,EAC/B,SAAkC,EAAE,EACpC,KAAc;QAEd,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE;YAClE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;YAC5B,iBAAiB,EAAE,KAAK,IAAI,iBAAiB,EAAE;SAChD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU,EAAE,OAAe,EAAE,MAAe;QACxD,MAAM,KAAK,GAA4B,EAAE,OAAO,EAAE,CAAC;QACnD,IAAI,MAAM,KAAK,SAAS;YAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAChD,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,SAAS,CACb,IAAY,EACZ,MAA+B,EAC/B,SAAkC,EAAE;QAEpC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE;YAC5E,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAA4B,KAAK,EAAE,yBAAyB,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,EAAU;QACpC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,2BAA2B,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACrF,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { type Saldo, type Servico } from "../dados.js";
2
+ import type { Transporte } from "../transporte.js";
3
+ /** Catalogo e saldo. Escopo `leitura`, nao gasta nada. */
4
+ export declare class Catalogo {
5
+ private readonly t;
6
+ constructor(t: Transporte);
7
+ /** O que ESTA conta pode consultar, com o preco dela. */
8
+ servicos(): Promise<Servico[]>;
9
+ saldo(): Promise<Saldo>;
10
+ }
11
+ //# sourceMappingURL=catalogo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalogo.d.ts","sourceRoot":"","sources":["../../../src/recursos/catalogo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,OAAO,EAA0B,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,0DAA0D;AAC1D,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,UAAU;IAE1C,yDAAyD;IACnD,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAK9B,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;CAG9B"}
@@ -0,0 +1,17 @@
1
+ import { paraSaldo, paraServico } from "../dados.js";
2
+ /** Catalogo e saldo. Escopo `leitura`, nao gasta nada. */
3
+ export class Catalogo {
4
+ t;
5
+ constructor(t) {
6
+ this.t = t;
7
+ }
8
+ /** O que ESTA conta pode consultar, com o preco dela. */
9
+ async servicos() {
10
+ const dados = await this.t.pedir("GET", "servicos");
11
+ return dados.map(paraServico);
12
+ }
13
+ async saldo() {
14
+ return paraSaldo(await this.t.pedir("GET", "saldo"));
15
+ }
16
+ }
17
+ //# sourceMappingURL=catalogo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalogo.js","sourceRoot":"","sources":["../../../src/recursos/catalogo.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/E,0DAA0D;AAC1D,MAAM,OAAO,QAAQ;IACU;IAA7B,YAA6B,CAAa;QAAb,MAAC,GAAD,CAAC,CAAY;IAAG,CAAC;IAE9C,yDAAyD;IACzD,KAAK,CAAC,QAAQ;QACZ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAA4B,KAAK,EAAE,UAAU,CAAC,CAAC;QAC/E,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import { type Transporte } from "../transporte.js";
2
+ /**
3
+ * Consultas. Escopo `consultas`. GASTA SALDO.
4
+ *
5
+ * O retorno vem como objeto solto e nao tipado de proposito: cada servico
6
+ * devolve um corpo diferente, a lista cresce, e tipar tudo aqui faria o SDK
7
+ * desatualizar a cada servico novo sem ninguem perceber.
8
+ */
9
+ export declare class Consultas {
10
+ private readonly t;
11
+ constructor(t: Transporte);
12
+ /**
13
+ * Executa uma consulta pelo slug do servico.
14
+ *
15
+ * A chave de idempotencia e GERADA quando voce nao passa uma, e e ela que
16
+ * torna seguro repetir: a mesma chave devolve a mesma resposta em vez de
17
+ * cobrar de novo. Guarde a sua se quiser poder reconsultar o resultado
18
+ * depois de um timeout.
19
+ */
20
+ executar(slug: string, documento: string, extras?: Record<string, unknown>, chave?: string): Promise<Record<string, unknown>>;
21
+ }
22
+ //# sourceMappingURL=consultas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consultas.d.ts","sourceRoot":"","sources":["../../../src/recursos/consultas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,kBAAkB,CAAC;AAEtE;;;;;;GAMG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,UAAU;IAE1C;;;;;;;OAOG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACpC,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAMpC"}
@@ -0,0 +1,29 @@
1
+ import { chaveIdempotencia } from "../transporte.js";
2
+ /**
3
+ * Consultas. Escopo `consultas`. GASTA SALDO.
4
+ *
5
+ * O retorno vem como objeto solto e nao tipado de proposito: cada servico
6
+ * devolve um corpo diferente, a lista cresce, e tipar tudo aqui faria o SDK
7
+ * desatualizar a cada servico novo sem ninguem perceber.
8
+ */
9
+ export class Consultas {
10
+ t;
11
+ constructor(t) {
12
+ this.t = t;
13
+ }
14
+ /**
15
+ * Executa uma consulta pelo slug do servico.
16
+ *
17
+ * A chave de idempotencia e GERADA quando voce nao passa uma, e e ela que
18
+ * torna seguro repetir: a mesma chave devolve a mesma resposta em vez de
19
+ * cobrar de novo. Guarde a sua se quiser poder reconsultar o resultado
20
+ * depois de um timeout.
21
+ */
22
+ async executar(slug, documento, extras = {}, chave) {
23
+ return this.t.pedir("POST", slug, {
24
+ corpo: { documento, ...extras },
25
+ chaveIdempotencia: chave ?? chaveIdempotencia(),
26
+ });
27
+ }
28
+ }
29
+ //# sourceMappingURL=consultas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consultas.js","sourceRoot":"","sources":["../../../src/recursos/consultas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,CAAa;QAAb,MAAC,GAAD,CAAC,CAAY;IAAG,CAAC;IAE9C;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,CACZ,IAAY,EACZ,SAAiB,EACjB,SAAkC,EAAE,EACpC,KAAc;QAEd,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;YAChC,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE;YAC/B,iBAAiB,EAAE,KAAK,IAAI,iBAAiB,EAAE;SAChD,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import { type SessaoVerify } from "../dados.js";
2
+ import type { Transporte } from "../transporte.js";
3
+ /**
4
+ * Verify: verificacao de identidade. Escopo `verify`. GASTA SALDO.
5
+ *
6
+ * ATENCAO ao criar: esta rota NAO tem idempotencia na api, entao o SDK nao
7
+ * repete a chamada sozinho. Se der timeout, NAO chame de novo as cegas: mande
8
+ * um `reference_id` seu na criacao e, na duvida, procure por ele antes de
9
+ * criar outra, senao voce paga duas sessoes.
10
+ */
11
+ export declare class Verify {
12
+ private readonly t;
13
+ constructor(t: Transporte);
14
+ /**
15
+ * Cria a sessao e devolve a URL para mandar a pessoa.
16
+ *
17
+ * @param fluxo uuid do fluxo ou o alias dele (ex.: "kyc-cnpj")
18
+ * @param input o que o fluxo pede de entrada (ex.: cpf)
19
+ * @param opcoes prefill, consent, redirect_url, webhook_url, reference_id
20
+ */
21
+ criarSessao(fluxo: string, input?: Record<string, unknown>, opcoes?: Record<string, unknown>): Promise<SessaoVerify>;
22
+ sessao(id: string): Promise<SessaoVerify>;
23
+ cancelar(id: string): Promise<SessaoVerify>;
24
+ }
25
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/recursos/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAc,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;;;GAOG;AACH,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,UAAU;IAE1C;;;;;;OAMG;IACG,WAAW,CACf,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAOlB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIzC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAGlD"}
@@ -0,0 +1,35 @@
1
+ import { paraSessao } from "../dados.js";
2
+ /**
3
+ * Verify: verificacao de identidade. Escopo `verify`. GASTA SALDO.
4
+ *
5
+ * ATENCAO ao criar: esta rota NAO tem idempotencia na api, entao o SDK nao
6
+ * repete a chamada sozinho. Se der timeout, NAO chame de novo as cegas: mande
7
+ * um `reference_id` seu na criacao e, na duvida, procure por ele antes de
8
+ * criar outra, senao voce paga duas sessoes.
9
+ */
10
+ export class Verify {
11
+ t;
12
+ constructor(t) {
13
+ this.t = t;
14
+ }
15
+ /**
16
+ * Cria a sessao e devolve a URL para mandar a pessoa.
17
+ *
18
+ * @param fluxo uuid do fluxo ou o alias dele (ex.: "kyc-cnpj")
19
+ * @param input o que o fluxo pede de entrada (ex.: cpf)
20
+ * @param opcoes prefill, consent, redirect_url, webhook_url, reference_id
21
+ */
22
+ async criarSessao(fluxo, input = {}, opcoes = {}) {
23
+ const corpo = { flow_id: fluxo, ...opcoes };
24
+ if (Object.keys(input).length > 0)
25
+ corpo.input = input;
26
+ return paraSessao(await this.t.pedir("POST", "verify/sessions", { corpo }));
27
+ }
28
+ async sessao(id) {
29
+ return paraSessao(await this.t.pedir("GET", `verify/sessions/${encodeURIComponent(id)}`));
30
+ }
31
+ async cancelar(id) {
32
+ return paraSessao(await this.t.pedir("POST", `verify/sessions/${encodeURIComponent(id)}/cancel`));
33
+ }
34
+ }
35
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/recursos/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,UAAU,EAAE,MAAM,aAAa,CAAC;AAG5D;;;;;;;GAOG;AACH,MAAM,OAAO,MAAM;IACY;IAA7B,YAA6B,CAAa;QAAb,MAAC,GAAD,CAAC,CAAY;IAAG,CAAC;IAE9C;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CACf,KAAa,EACb,QAAiC,EAAE,EACnC,SAAkC,EAAE;QAEpC,MAAM,KAAK,GAA4B,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC;QACrE,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QAEvD,OAAO,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,OAAO,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,mBAAmB,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,mBAAmB,kBAAkB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACpG,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ import type { Transporte } from "../transporte.js";
2
+ /**
3
+ * Para onde mandamos os eventos, e o segredo que os assina.
4
+ *
5
+ * Escopo `webhooks`, que e proposital e separado: de a um token de
6
+ * PROVISIONAMENTO, nao ao token que o seu servidor usa todo dia. Quem tem
7
+ * este escopo pode redirecionar os seus eventos. O token padrao NAO o tem, e
8
+ * por isso estas chamadas devolvem `SemEscopo` com um token comum.
9
+ */
10
+ export declare class Webhooks {
11
+ private readonly t;
12
+ constructor(t: Transporte);
13
+ /** Destino atual e o PREFIXO do segredo, nunca o segredo. */
14
+ atual(): Promise<Record<string, unknown>>;
15
+ definir(url: string, eventos?: string[]): Promise<Record<string, unknown>>;
16
+ remover(): Promise<Record<string, unknown>>;
17
+ /**
18
+ * Gira o segredo e devolve o novo, UMA unica vez.
19
+ *
20
+ * Guarde na hora: a consulta nunca mais mostra o valor inteiro. E lembre
21
+ * que girar invalida a assinatura dos avisos em voo.
22
+ */
23
+ girarSegredo(): Promise<Record<string, unknown>>;
24
+ /** Dispara um evento de teste para o seu endpoint. */
25
+ testar(url?: string): Promise<Record<string, unknown>>;
26
+ }
27
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../../src/recursos/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;;;GAOG;AACH,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,UAAU;IAE1C,6DAA6D;IACvD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIzC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAM9E,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIjD;;;;;OAKG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAItD,sDAAsD;IAChD,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAG7D"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Para onde mandamos os eventos, e o segredo que os assina.
3
+ *
4
+ * Escopo `webhooks`, que e proposital e separado: de a um token de
5
+ * PROVISIONAMENTO, nao ao token que o seu servidor usa todo dia. Quem tem
6
+ * este escopo pode redirecionar os seus eventos. O token padrao NAO o tem, e
7
+ * por isso estas chamadas devolvem `SemEscopo` com um token comum.
8
+ */
9
+ export class Webhooks {
10
+ t;
11
+ constructor(t) {
12
+ this.t = t;
13
+ }
14
+ /** Destino atual e o PREFIXO do segredo, nunca o segredo. */
15
+ async atual() {
16
+ return this.t.pedir("GET", "webhooks");
17
+ }
18
+ async definir(url, eventos = []) {
19
+ const corpo = { url };
20
+ if (eventos.length > 0)
21
+ corpo.eventos = eventos;
22
+ return this.t.pedir("PUT", "webhooks", { corpo });
23
+ }
24
+ async remover() {
25
+ return this.t.pedir("DELETE", "webhooks");
26
+ }
27
+ /**
28
+ * Gira o segredo e devolve o novo, UMA unica vez.
29
+ *
30
+ * Guarde na hora: a consulta nunca mais mostra o valor inteiro. E lembre
31
+ * que girar invalida a assinatura dos avisos em voo.
32
+ */
33
+ async girarSegredo() {
34
+ return this.t.pedir("POST", "webhooks/secret/rotate");
35
+ }
36
+ /** Dispara um evento de teste para o seu endpoint. */
37
+ async testar(url) {
38
+ return this.t.pedir("POST", "webhooks/testar", { corpo: url ? { url } : null });
39
+ }
40
+ }
41
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/recursos/webhooks.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,OAAO,QAAQ;IACU;IAA7B,YAA6B,CAAa;QAAb,MAAC,GAAD,CAAC,CAAY;IAAG,CAAC;IAE9C,6DAA6D;IAC7D,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,UAAoB,EAAE;QAC/C,MAAM,KAAK,GAA4B,EAAE,GAAG,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QAChD,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IACxD,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,MAAM,CAAC,GAAY;QACvB,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ import { type ConfigResolvida } from "./configuracao.js";
2
+ /**
3
+ * O transporte: fala HTTP com a `/api/v2` e traduz resposta em dado ou erro.
4
+ *
5
+ * Tres decisoes que valem o comentario, porque sao as que diferenciam um SDK
6
+ * de um `fetch` embrulhado:
7
+ *
8
+ * 1. RETRY SO ONDE E SEGURO. A api aceita `Idempotency-Key` em consulta,
9
+ * analise e operacao, e e so nessas que repetir e seguro: a mesma chave
10
+ * devolve a mesma resposta em vez de cobrar de novo. Criar sessao de
11
+ * Verify NAO tem idempotencia, entao repetir ali criaria uma segunda
12
+ * sessao faturavel. Por isso o retry nao e uma opcao global: ele e ligado
13
+ * por chamada, e so quando o SDK manda a chave.
14
+ * 2. A CHAVE E GERADA PELO SDK quando quem chama nao passa uma. Deixar isso
15
+ * para o integrador significa, na pratica, ninguem usar, e e justamente o
16
+ * caso em que a falha doi: timeout numa consulta paga.
17
+ * 3. FALHA SEM RESPOSTA NAO E ERRO DE SERVIDOR. `FalhaDeRede` existe porque
18
+ * nesse caso nao se sabe se a operacao aconteceu, e a acao correta e
19
+ * consultar pela chave, nao repetir as cegas.
20
+ */
21
+ export declare class Transporte {
22
+ private readonly config;
23
+ constructor(config: ConfigResolvida);
24
+ pedir<T = Record<string, unknown>>(metodo: string, caminho: string, opcoes?: {
25
+ corpo?: Record<string, unknown> | null;
26
+ query?: Record<string, string | number | undefined>;
27
+ chaveIdempotencia?: string;
28
+ }): Promise<T>;
29
+ private interpretar;
30
+ /** Espera entre tentativas, respeitando `Retry-After` quando ele vem. */
31
+ private esperar;
32
+ }
33
+ /** Chave nova de idempotencia, no formato que a api aceita. */
34
+ export declare function chaveIdempotencia(): string;
35
+ //# sourceMappingURL=transporte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transporte.d.ts","sourceRoot":"","sources":["../../src/transporte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAa,MAAM,mBAAmB,CAAC;AAGpE;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAE9C,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,GAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACvC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;QACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;KACvB,GACL,OAAO,CAAC,CAAC,CAAC;YAkEC,WAAW;IAwBzB,yEAAyE;YAC3D,OAAO;CAatB;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C"}
@@ -0,0 +1,123 @@
1
+ import { userAgent } from "./configuracao.js";
2
+ import { ErroRadarData, FalhaDeRede, erroDoStatus } from "./erros.js";
3
+ /**
4
+ * O transporte: fala HTTP com a `/api/v2` e traduz resposta em dado ou erro.
5
+ *
6
+ * Tres decisoes que valem o comentario, porque sao as que diferenciam um SDK
7
+ * de um `fetch` embrulhado:
8
+ *
9
+ * 1. RETRY SO ONDE E SEGURO. A api aceita `Idempotency-Key` em consulta,
10
+ * analise e operacao, e e so nessas que repetir e seguro: a mesma chave
11
+ * devolve a mesma resposta em vez de cobrar de novo. Criar sessao de
12
+ * Verify NAO tem idempotencia, entao repetir ali criaria uma segunda
13
+ * sessao faturavel. Por isso o retry nao e uma opcao global: ele e ligado
14
+ * por chamada, e so quando o SDK manda a chave.
15
+ * 2. A CHAVE E GERADA PELO SDK quando quem chama nao passa uma. Deixar isso
16
+ * para o integrador significa, na pratica, ninguem usar, e e justamente o
17
+ * caso em que a falha doi: timeout numa consulta paga.
18
+ * 3. FALHA SEM RESPOSTA NAO E ERRO DE SERVIDOR. `FalhaDeRede` existe porque
19
+ * nesse caso nao se sabe se a operacao aconteceu, e a acao correta e
20
+ * consultar pela chave, nao repetir as cegas.
21
+ */
22
+ export class Transporte {
23
+ config;
24
+ constructor(config) {
25
+ this.config = config;
26
+ }
27
+ async pedir(metodo, caminho, opcoes = {}) {
28
+ const { corpo, query, chaveIdempotencia } = opcoes;
29
+ const cabecalhos = {
30
+ Authorization: `Bearer ${this.config.token}`,
31
+ Accept: "application/json",
32
+ "User-Agent": userAgent(),
33
+ };
34
+ // Repetir so e seguro com a chave: sem ela, uma consulta cobrada duas
35
+ // vezes seria dinheiro do cliente.
36
+ const podeRepetir = typeof chaveIdempotencia === "string" && chaveIdempotencia !== "";
37
+ if (podeRepetir)
38
+ cabecalhos["Idempotency-Key"] = chaveIdempotencia;
39
+ if (corpo != null)
40
+ cabecalhos["Content-Type"] = "application/json";
41
+ let url = `${this.config.base}/${caminho.replace(/^\/+/, "")}`;
42
+ if (query) {
43
+ const q = new URLSearchParams();
44
+ for (const [k, v] of Object.entries(query))
45
+ if (v !== undefined)
46
+ q.set(k, String(v));
47
+ if ([...q].length > 0)
48
+ url += `?${q.toString()}`;
49
+ }
50
+ const tentativas = podeRepetir ? this.config.tentativas : 1;
51
+ let ultimo = null;
52
+ for (let i = 1; i <= tentativas; i++) {
53
+ const abortar = new AbortController();
54
+ const relogio = setTimeout(() => abortar.abort(), this.config.timeoutMs);
55
+ let resposta;
56
+ try {
57
+ resposta = await this.config.fetch(url, {
58
+ method: metodo,
59
+ headers: cabecalhos,
60
+ body: corpo != null ? JSON.stringify(corpo) : undefined,
61
+ signal: abortar.signal,
62
+ });
63
+ }
64
+ catch (e) {
65
+ ultimo = new FalhaDeRede(`Não foi possível falar com o RadarData: ${e instanceof Error ? e.message : String(e)}`, "falha_de_rede", null, {}, { cause: e });
66
+ if (i < tentativas) {
67
+ await this.esperar(i);
68
+ continue;
69
+ }
70
+ throw ultimo;
71
+ }
72
+ finally {
73
+ clearTimeout(relogio);
74
+ }
75
+ // 429 e 5xx valem nova tentativa; o resto e resposta final.
76
+ if ((resposta.status === 429 || resposta.status >= 500) && i < tentativas) {
77
+ await this.esperar(i, resposta);
78
+ continue;
79
+ }
80
+ return (await this.interpretar(resposta));
81
+ }
82
+ throw ultimo ?? new ErroRadarData("Falha desconhecida no transporte.");
83
+ }
84
+ async interpretar(resposta) {
85
+ const cru = await resposta.text();
86
+ let json;
87
+ try {
88
+ json = cru === "" ? {} : JSON.parse(cru);
89
+ }
90
+ catch {
91
+ json = {};
92
+ }
93
+ const corpo = (json ?? {});
94
+ if (resposta.ok) {
95
+ // `data` quando a rota embrulha (catalogo, saldo, analises) e o corpo
96
+ // inteiro quando nao (sessao de Verify). Devolver sempre o conteudo
97
+ // util poupa quem chama de saber qual rota faz o que.
98
+ return "data" in corpo && corpo.data !== null && typeof corpo.data === "object" ? corpo.data : corpo;
99
+ }
100
+ const erro = (corpo.error ?? {});
101
+ const mensagem = erro.message ?? corpo.message ?? `O RadarData respondeu ${resposta.status} sem detalhe.`;
102
+ throw erroDoStatus(resposta.status, mensagem, erro.code ?? null, corpo);
103
+ }
104
+ /** Espera entre tentativas, respeitando `Retry-After` quando ele vem. */
105
+ async esperar(tentativa, resposta) {
106
+ const cabecalho = Number(resposta?.headers.get("Retry-After") ?? 0);
107
+ if (cabecalho > 0) {
108
+ await new Promise((r) => setTimeout(r, Math.min(cabecalho, 30) * 1000));
109
+ return;
110
+ }
111
+ // Recuo exponencial com um pouco de aleatorio, para muitos clientes
112
+ // falhando juntos nao voltarem todos no mesmo instante.
113
+ const base = Math.min(8, 2 ** (tentativa - 1));
114
+ await new Promise((r) => setTimeout(r, base * 1000 + Math.random() * 250));
115
+ }
116
+ }
117
+ /** Chave nova de idempotencia, no formato que a api aceita. */
118
+ export function chaveIdempotencia() {
119
+ const bytes = new Uint8Array(16);
120
+ globalThis.crypto.getRandomValues(bytes);
121
+ return [...bytes].map((b) => b.toString(16).padStart(2, "0")).join("");
122
+ }
123
+ //# sourceMappingURL=transporte.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transporte.js","sourceRoot":"","sources":["../../src/transporte.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Confere que o webhook veio mesmo do RadarData.
3
+ *
4
+ * Mandamos `X-RadarData-Signature: sha256=<hmac do CORPO CRU com o seu
5
+ * webhook_secret>`, mais `X-RadarData-Event`, `X-RadarData-Delivery` e
6
+ * `X-RadarData-Timestamp`.
7
+ *
8
+ * Aceita `string` ou `Uint8Array`, e nao `Buffer`, de proposito: `Buffer` e um
9
+ * global do Node e poria `@types/node` na superficie publica do pacote, o que
10
+ * quebra o `tsc` de quem compila para borda, Deno ou navegador. `Buffer` E um
11
+ * `Uint8Array`, entao o que o `express.raw()` entrega continua servindo.
12
+ *
13
+ * O CORPO TEM DE SER O CRU. Em Express e `express.raw()`, nao `express.json()`;
14
+ * reserializar o objeto ja decodificado muda espaco e ordem de chave, o HMAC
15
+ * muda junto e a conferencia falha sem motivo aparente. E o erro mais comum
16
+ * nesta parte, em qualquer integracao.
17
+ *
18
+ * LIMITE QUE VOCE PRECISA CONHECER: o timestamp e o id de entrega viajam em
19
+ * CABECALHO, fora do corpo assinado, entao a assinatura prova a ORIGEM e o
20
+ * CONTEUDO, e nao a hora. Ela nao protege contra reenvio de um aviso antigo e
21
+ * autentico por quem o tenha interceptado. A defesa pratica e guardar o
22
+ * `X-RadarData-Delivery` e ignorar o que ja foi processado, que voce deve
23
+ * fazer de qualquer forma, porque reenviamos em caso de falha.
24
+ */
25
+ export declare function confereAssinatura(corpoCru: string | Uint8Array, assinatura: string | null | undefined, segredo: string): boolean;
26
+ /**
27
+ * Confere e devolve o evento decodificado, ou lança.
28
+ *
29
+ * @throws Error quando a assinatura nao confere
30
+ */
31
+ export declare function exigirAssinatura(corpoCru: string | Uint8Array, assinatura: string | null | undefined, segredo: string): Record<string, unknown>;
32
+ //# sourceMappingURL=assinatura.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assinatura.d.ts","sourceRoot":"","sources":["../../../src/webhooks/assinatura.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,UAAU,EAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,OAAO,EAAE,MAAM,GACd,OAAO,CAgBT;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,UAAU,EAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB"}