@rebound-dlq/node 0.1.0 → 0.2.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/README.md +78 -75
- package/dist/core/wrapper.d.ts +0 -2
- package/dist/core/wrapper.js +0 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,103 +1,106 @@
|
|
|
1
|
-
# Rebound DLQ
|
|
1
|
+
# Rebound DLQ for Node.js
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@rebound-dlq/node)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
O **@rebound-dlq/node** é o SDK oficial em Node.js para integração com a plataforma **[Rebound DLQ](https://rebound-dlq.com)**.
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
Este pacote permite capturar falhas em integrações (APIs de terceiros, pagamentos, envio de e-mails, etc.) de forma transparente para a sua aplicação Node.js. Sem travar sua regra de negócio e sem adicionar latência. Quando uma operação falha, o SDK captura o payload, criptografa a informação e envia o evento em plano de fundo (background) para a sua conta no Rebound DLQ, aplicando estratégias de retry exponencial automaticamente se houver instabilidade na rede.
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
## Por que usar o Rebound DLQ?
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
*(Nota: Se você está rodando um pacote em testes local via `.tgz`, use: `npm install ./caminho/do/seu/rebound-dlq-sdk-0.1.0.tgz`)*
|
|
12
|
+
- ⚡ **Zero Latência (In-Memory Queue)**: A aplicação não espera a resposta do envio do log para a nossa infraestrutura. A execução ocorre inteiramente em memória e em background, liberando o processo Node.js principal na hora (`O(1)`).
|
|
13
|
+
- 🛡️ **Segurança e Criptografia Local**: Todo o payload de erro é criptografado localmente na sua máquina (usando AES-256) antes mesmo de trafegar pela rede. Seus dados chegam anônimos na nossa infraestrutura, e somente você consegue descriptografá-los com a sua chave secreta.
|
|
14
|
+
- 🔁 **Resiliência e Retentativa Automática**: Falhas de rede ou indisponibilidade? O SDK mantém o evento a salvo em memória e aplica _backoff exponencial_ para garantir a entrega quando a conexão for reestabelecida.
|
|
16
15
|
|
|
17
|
-
|
|
16
|
+
> ⚠️ **Atenção**: Este SDK requer uma conta ativa na plataforma **[Rebound DLQ](https://rebound-dlq.com)**.
|
|
18
17
|
|
|
19
|
-
##
|
|
18
|
+
## Instalação
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
Abra o terminal e instale o pacote via npm, yarn ou pnpm:
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
```bash
|
|
23
|
+
npm install @rebound-dlq/node
|
|
24
|
+
```
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
## Configuração Segura
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
// Se você usa CommonJS (require):
|
|
29
|
-
const { DlqWrapper } = require('@rebound/dlq-sdk');
|
|
28
|
+
O SDK só precisa da chave de integração do seu projeto (`projectSecret`).
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
// import { DlqWrapper } from '@rebound/dlq-sdk';
|
|
30
|
+
**Prática Recomendada:** Nunca exponha (hard-code) a sua chave diretamente no código-fonte. Armazene a sua chave `projectSecret` de forma segura utilizando variáveis de ambiente (ex: arquivo `.env`).
|
|
33
31
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
});
|
|
32
|
+
```env
|
|
33
|
+
# Arquivo .env
|
|
34
|
+
REBOUND_PROJECT_SECRET="sk_dev_sua_chave_secreta_aqui"
|
|
38
35
|
```
|
|
39
36
|
|
|
40
|
-
|
|
37
|
+
> **Dica de Ambiente**:
|
|
38
|
+
> - Chaves iniciadas com `sk_dev_` enviarão eventos automaticamente para o ambiente de testes/sandbox.
|
|
39
|
+
> - Chaves iniciadas com `sk_live_` enviarão eventos para o ambiente de produção.
|
|
41
40
|
|
|
42
|
-
|
|
41
|
+
## Uso Básico
|
|
43
42
|
|
|
44
|
-
|
|
43
|
+
A forma ideal de utilizar o SDK é encapsular a sua função com o método `.execute()` oferecido pela classe `DlqWrapper`.
|
|
45
44
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
45
|
+
Se atente à inicialização e uso:
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
import { DlqWrapper } from '@rebound-dlq/node';
|
|
49
|
+
|
|
50
|
+
// Inicializa o SDK consumindo de variáveis de ambiente
|
|
51
|
+
const dlq = new DlqWrapper({
|
|
52
|
+
projectSecret: process.env.REBOUND_PROJECT_SECRET,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// A função que se conecta ao seu provedor ou ao seu banco de dados (que pode falhar)
|
|
56
|
+
async function processarPagamento(dados) {
|
|
57
|
+
if (dados.valor > 1000) {
|
|
58
|
+
throw new Error('Saldo insuficiente na operadora do cartão');
|
|
59
|
+
}
|
|
60
|
+
return 'Sucesso!';
|
|
54
61
|
}
|
|
55
62
|
|
|
56
|
-
async function
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
// sem travar ou deixar sua API mais lenta!
|
|
82
|
-
}
|
|
63
|
+
async function main() {
|
|
64
|
+
// Os dados de contexto que você gostaria de analisar depois se algo der errado
|
|
65
|
+
const payloadQueSeraSalvoNaDLQ = {
|
|
66
|
+
userId: '123',
|
|
67
|
+
valor: 5000,
|
|
68
|
+
tentativa: 1,
|
|
69
|
+
modulo: 'Checkout',
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
console.log("Iniciando transação...");
|
|
74
|
+
|
|
75
|
+
// Protegemos a função com o wrapper. Se der erro dentro de processarPagamento,
|
|
76
|
+
// o dlq envia os detalhes do erro E o payloadQueSeraSalvoNaDLQ para o Rebound automatically!
|
|
77
|
+
const resultado = await dlq.execute(
|
|
78
|
+
() => processarPagamento(payloadQueSeraSalvoNaDLQ),
|
|
79
|
+
payloadQueSeraSalvoNaDLQ
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
console.log('Finalizado com:', resultado);
|
|
83
|
+
|
|
84
|
+
} catch (erro) {
|
|
85
|
+
// A aplicação não morre; o erro é lançado apenas para seu tratamento habitual
|
|
86
|
+
console.log('Aconteceu um erro previsto na aplicação:', erro.message);
|
|
87
|
+
}
|
|
83
88
|
}
|
|
84
89
|
|
|
85
|
-
|
|
90
|
+
main();
|
|
86
91
|
```
|
|
87
92
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
## ⚡ Por que usar nossa DLQ Engine?
|
|
93
|
+
### O que acontece por baixo dos panos neste exemplo?
|
|
91
94
|
|
|
92
|
-
1.
|
|
93
|
-
2.
|
|
94
|
-
3.
|
|
95
|
+
1. Ao chamar `.execute()`, se o `processarPagamento` lançar qualquer **exceção**.
|
|
96
|
+
2. Essa exceção é **capturada sem dor**.
|
|
97
|
+
3. A variável `payloadQueSeraSalvoNaDLQ` entra na **memória RAM do SDK**.
|
|
98
|
+
4. É processada **criptografia local AES-256** no dado, utilizando a sua chave.
|
|
99
|
+
5. Em Background, um processo envia de forma segura este evento para a plataforma Rebound, garantindo entrega do Dead Letter Queue para reprocessamento futuro ou simples visualização pela Dashboard.
|
|
95
100
|
|
|
96
|
-
|
|
101
|
+
## Suporte
|
|
97
102
|
|
|
98
|
-
|
|
99
|
-
- `sk_live_*` conectará aos endpoints oficiais estabilizados de produção.
|
|
103
|
+
Em caso de dúvidas, problemas de implementação ou bugs, abra um chamado pela Dashboard oficial do [Rebound Platform](https://rebound-dlq.com).
|
|
100
104
|
|
|
101
|
-
|
|
102
|
-
**
|
|
103
|
-
Dúvidas ou problemas? Acesse seu dashboard e abra um chamado com nosso time de engenharia.
|
|
105
|
+
***
|
|
106
|
+
_Feito com ❤️ por **[Codify Labs] / [Rebound DLQ]**._
|
package/dist/core/wrapper.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
export interface DlqServiceConfig {
|
|
2
|
-
projectId: string;
|
|
3
2
|
projectSecret: string;
|
|
4
3
|
endpoint?: string;
|
|
5
4
|
maxFailures?: number;
|
|
6
5
|
}
|
|
7
6
|
export declare class DlqWrapper {
|
|
8
|
-
private projectId;
|
|
9
7
|
private projectSecret;
|
|
10
8
|
private readonly endpoint;
|
|
11
9
|
constructor(config: DlqServiceConfig);
|
package/dist/core/wrapper.js
CHANGED
|
@@ -9,7 +9,6 @@ const constants_1 = require("./constants");
|
|
|
9
9
|
const queue_1 = require("./queue");
|
|
10
10
|
class DlqWrapper {
|
|
11
11
|
constructor(config) {
|
|
12
|
-
this.projectId = config.projectId;
|
|
13
12
|
this.projectSecret = config.projectSecret;
|
|
14
13
|
// Identifica se é ambiente de teste através do projectSecret (mesma lógica da apiKey no ReboundClient)
|
|
15
14
|
const isTest = config.projectSecret.startsWith('sk_dev_');
|
|
@@ -35,7 +34,6 @@ class DlqWrapper {
|
|
|
35
34
|
const fingerprint = this.generateFingerprint(error);
|
|
36
35
|
const encryptedPayload = this.encrypt(payload);
|
|
37
36
|
const data = {
|
|
38
|
-
projectId: this.projectId,
|
|
39
37
|
fingerprint,
|
|
40
38
|
error: {
|
|
41
39
|
name: error.name,
|