@radardata/sdk 0.0.0-stage → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +202 -2
- package/dist/cjs/configuracao.js +28 -0
- package/dist/cjs/configuracao.js.map +1 -0
- package/dist/cjs/dados.js +44 -0
- package/dist/cjs/dados.js.map +1 -0
- package/dist/cjs/erros.js +86 -0
- package/dist/cjs/erros.js.map +1 -0
- package/dist/cjs/index.js +69 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/recursos/analises.js +53 -0
- package/dist/cjs/recursos/analises.js.map +1 -0
- package/dist/cjs/recursos/catalogo.js +21 -0
- package/dist/cjs/recursos/catalogo.js.map +1 -0
- package/dist/cjs/recursos/consultas.js +33 -0
- package/dist/cjs/recursos/consultas.js.map +1 -0
- package/dist/cjs/recursos/verify.js +39 -0
- package/dist/cjs/recursos/verify.js.map +1 -0
- package/dist/cjs/recursos/webhooks.js +45 -0
- package/dist/cjs/recursos/webhooks.js.map +1 -0
- package/dist/cjs/transporte.js +128 -0
- package/dist/cjs/transporte.js.map +1 -0
- package/dist/cjs/webhooks/assinatura.js +65 -0
- package/dist/cjs/webhooks/assinatura.js.map +1 -0
- package/dist/esm/configuracao.d.ts +27 -0
- package/dist/esm/configuracao.d.ts.map +1 -0
- package/dist/esm/configuracao.js +23 -0
- package/dist/esm/configuracao.js.map +1 -0
- package/dist/esm/dados.d.ts +59 -0
- package/dist/esm/dados.d.ts.map +1 -0
- package/dist/esm/dados.js +38 -0
- package/dist/esm/dados.js.map +1 -0
- package/dist/esm/erros.d.ts +53 -0
- package/dist/esm/erros.d.ts.map +1 -0
- package/dist/esm/erros.js +73 -0
- package/dist/esm/erros.js.map +1 -0
- package/dist/esm/index.d.ts +41 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +47 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/recursos/analises.d.ts +25 -0
- package/dist/esm/recursos/analises.d.ts.map +1 -0
- package/dist/esm/recursos/analises.js +49 -0
- package/dist/esm/recursos/analises.js.map +1 -0
- package/dist/esm/recursos/catalogo.d.ts +11 -0
- package/dist/esm/recursos/catalogo.d.ts.map +1 -0
- package/dist/esm/recursos/catalogo.js +17 -0
- package/dist/esm/recursos/catalogo.js.map +1 -0
- package/dist/esm/recursos/consultas.d.ts +22 -0
- package/dist/esm/recursos/consultas.d.ts.map +1 -0
- package/dist/esm/recursos/consultas.js +29 -0
- package/dist/esm/recursos/consultas.js.map +1 -0
- package/dist/esm/recursos/verify.d.ts +25 -0
- package/dist/esm/recursos/verify.d.ts.map +1 -0
- package/dist/esm/recursos/verify.js +35 -0
- package/dist/esm/recursos/verify.js.map +1 -0
- package/dist/esm/recursos/webhooks.d.ts +27 -0
- package/dist/esm/recursos/webhooks.d.ts.map +1 -0
- package/dist/esm/recursos/webhooks.js +41 -0
- package/dist/esm/recursos/webhooks.js.map +1 -0
- package/dist/esm/transporte.d.ts +35 -0
- package/dist/esm/transporte.d.ts.map +1 -0
- package/dist/esm/transporte.js +123 -0
- package/dist/esm/transporte.js.map +1 -0
- package/dist/esm/webhooks/assinatura.d.ts +32 -0
- package/dist/esm/webhooks/assinatura.d.ts.map +1 -0
- package/dist/esm/webhooks/assinatura.js +61 -0
- package/dist/esm/webhooks/assinatura.js.map +1 -0
- package/package.json +47 -4
- package/src/configuracao.ts +50 -0
- package/src/dados.ts +93 -0
- package/src/erros.ts +70 -0
- package/src/index.ts +66 -0
- package/src/recursos/analises.ts +61 -0
- package/src/recursos/catalogo.ts +17 -0
- package/src/recursos/consultas.ts +32 -0
- package/src/recursos/verify.ts +40 -0
- package/src/recursos/webhooks.ts +43 -0
- package/src/transporte.ts +145 -0
- 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"}
|