@rebound-dlq/node 0.2.4 → 0.2.5
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 +69 -212
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,87 +1,50 @@
|
|
|
1
|
-
# Rebound DLQ
|
|
1
|
+
# Rebound DLQ — Node.js SDK
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@rebound-dlq/node)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
SDK oficial em Node.js para integrar sua aplicação com a plataforma **[Rebound DLQ](https://rebound-dlq.com)**.
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Capture falhas, registre eventos de erro e garanta rastreabilidade das suas filas mortas — tudo sem impactar a performance da sua aplicação.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Por que usar?
|
|
11
13
|
|
|
12
|
-
- **Zero
|
|
13
|
-
- **Criptografia local AES-256
|
|
14
|
-
- **Entrega resiliente
|
|
15
|
-
- **
|
|
16
|
-
- **Retomada automatica**: quando a conta faz upgrade ou libera overage, o SDK volta a enviar sozinho.
|
|
14
|
+
- **Zero latência no fluxo principal** — o evento é enfileirado em memória e a aplicação segue sem esperar resposta de rede.
|
|
15
|
+
- **Criptografia local AES-256** — o payload é criptografado antes de sair do seu processo.
|
|
16
|
+
- **Entrega resiliente** — retry automático com backoff exponencial em caso de falha de rede.
|
|
17
|
+
- **Sem config extra** — o comportamento de retry, buffer e retomada é totalmente automático, determinado pela configuração da conta na plataforma.
|
|
17
18
|
|
|
18
|
-
>
|
|
19
|
+
> **Pré-requisito:** uma conta e um projeto ativos em [rebound-dlq.com](https://rebound-dlq.com).
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Instalação
|
|
21
24
|
|
|
22
25
|
```bash
|
|
23
26
|
npm install @rebound-dlq/node
|
|
24
27
|
```
|
|
25
28
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
Para usar o SDK com o comportamento completo desta versao:
|
|
29
|
-
|
|
30
|
-
- uma chave valida do projeto
|
|
31
|
-
- uma API Rebound atualizada, com suporte a:
|
|
32
|
-
- `POST /dlq-injestion`
|
|
33
|
-
- `POST /dlq-injestion/runtime-state`
|
|
34
|
-
- autenticacao HMAC com `x-api-key`, `x-sdk-timestamp` e `x-sdk-signature`
|
|
35
|
-
- resposta estruturada de bloqueio por limite de plano
|
|
29
|
+
---
|
|
36
30
|
|
|
37
|
-
|
|
31
|
+
## Configuração
|
|
38
32
|
|
|
39
|
-
|
|
33
|
+
A única configuração obrigatória é o `projectSecret`, obtido no painel da plataforma Rebound DLQ.
|
|
40
34
|
|
|
41
|
-
Nunca exponha a chave
|
|
35
|
+
Nunca exponha a chave no código-fonte. Use variáveis de ambiente:
|
|
42
36
|
|
|
43
37
|
```env
|
|
44
38
|
REBOUND_PROJECT_SECRET="seu_project_secret_aqui"
|
|
45
39
|
```
|
|
46
40
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
Os arquivos em `examples/` foram deixados simples para teste local. Cada example tem duas variaveis no topo do arquivo:
|
|
50
|
-
|
|
51
|
-
- `PROJECT_SECRET`
|
|
52
|
-
- `API_ENDPOINT`
|
|
53
|
-
|
|
54
|
-
Edite esses valores diretamente no arquivo que voce quer testar e depois rode o script.
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
npm run example:wrapper
|
|
58
|
-
npm run example:http
|
|
59
|
-
npm run example:kafka
|
|
60
|
-
npm run example:internal
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
Se preferir, voce tambem pode chamar o runner diretamente:
|
|
64
|
-
|
|
65
|
-
```bash
|
|
66
|
-
node scripts/run-example.cjs wrapper
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
Os exemplos encerram sozinhos apos uma pequena janela de observacao para nao ficarem presos em retries de background quando a API estiver offline. Se quiser alterar isso, use `REBOUND_EXAMPLE_GRACE_MS`.
|
|
70
|
-
|
|
71
|
-
### Fluxo unico de configuracao
|
|
72
|
-
|
|
73
|
-
O SDK agora trabalha com um fluxo unico:
|
|
74
|
-
|
|
75
|
-
- `projectSecret` para autenticar e derivar a criptografia local
|
|
76
|
-
- `endpoint` para definir para qual API Rebound os eventos devem ser enviados
|
|
77
|
-
|
|
78
|
-
Nao existe mais diferenca publica entre ambiente de teste e producao dentro do SDK. Se voce quiser apontar para outra API, basta informar `endpoint` explicitamente.
|
|
41
|
+
---
|
|
79
42
|
|
|
80
|
-
## Interfaces
|
|
43
|
+
## Interfaces disponíveis
|
|
81
44
|
|
|
82
|
-
###
|
|
45
|
+
### `DlqWrapper` — recomendado
|
|
83
46
|
|
|
84
|
-
|
|
47
|
+
Encapsula qualquer função assíncrona. Se ela lançar uma exceção, o evento de erro é capturado, criptografado e enviado automaticamente em background.
|
|
85
48
|
|
|
86
49
|
```ts
|
|
87
50
|
import { DlqWrapper } from '@rebound-dlq/node';
|
|
@@ -91,38 +54,21 @@ const dlq = new DlqWrapper({
|
|
|
91
54
|
});
|
|
92
55
|
```
|
|
93
56
|
|
|
94
|
-
|
|
57
|
+
**Parâmetros:**
|
|
95
58
|
|
|
96
|
-
| Campo |
|
|
97
|
-
|
|
98
|
-
| `projectSecret` | Sim | Chave secreta do projeto usada para
|
|
99
|
-
| `endpoint` | Nao | URL base da sua API Rebound, por exemplo `https://api.suaempresa.com/api/v1`. O SDK monta `/dlq-injestion` automaticamente, mas tambem aceita a URL completa por compatibilidade. |
|
|
100
|
-
| `maxFailures` | Nao | Mantido apenas por compatibilidade retroativa. Atualmente nao altera o comportamento da fila. |
|
|
59
|
+
| Campo | Obrigatório | Descrição |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `projectSecret` | ✅ Sim | Chave secreta do projeto, usada para autenticação e criptografia local. |
|
|
101
62
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
Melhor opcao para enviar payloads DLQ manualmente ou usar os adapters.
|
|
63
|
+
**Uso:**
|
|
105
64
|
|
|
106
65
|
```ts
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
const client = new ReboundClient({
|
|
110
|
-
projectSecret: process.env.REBOUND_PROJECT_SECRET!,
|
|
111
|
-
endpoint: process.env.REBOUND_API_ENDPOINT,
|
|
112
|
-
});
|
|
66
|
+
const resultado = await dlq.execute(() => minhaFuncaoQuePodefFalhar(dados), dados);
|
|
113
67
|
```
|
|
114
68
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
| Campo | Obrigatorio | Descricao |
|
|
118
|
-
| --- | --- | --- |
|
|
119
|
-
| `projectSecret` | Sim | Secret do projeto criado no painel, usado para autenticar as chamadas do SDK. |
|
|
120
|
-
| `endpoint` | Nao | URL base da sua API Rebound, por exemplo `https://api.suaempresa.com/api/v1`. O SDK monta `/dlq-injestion` automaticamente, mas tambem aceita a URL completa por compatibilidade. |
|
|
121
|
-
| `timeout` | Nao | Campo reservado no tipo de configuracao. Atualmente nao altera o transporte. |
|
|
122
|
-
|
|
123
|
-
Quando voce usa `ReboundClient` ou um adapter, o SDK converte o payload manual para o contrato de ingestao da API, gera `fingerprint`, criptografa o envelope localmente e envia no mesmo formato aceito pelo backend.
|
|
69
|
+
O erro original é sempre relançado para o seu tratamento normal. O SDK apenas captura, criptografa e envia o evento em background.
|
|
124
70
|
|
|
125
|
-
|
|
71
|
+
**Exemplo completo:**
|
|
126
72
|
|
|
127
73
|
```ts
|
|
128
74
|
import { DlqWrapper } from '@rebound-dlq/node';
|
|
@@ -131,47 +77,29 @@ const dlq = new DlqWrapper({
|
|
|
131
77
|
projectSecret: process.env.REBOUND_PROJECT_SECRET!,
|
|
132
78
|
});
|
|
133
79
|
|
|
134
|
-
async function processarPagamento(dados: {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
tentativa: number;
|
|
138
|
-
modulo: string;
|
|
139
|
-
}) {
|
|
140
|
-
if (dados.valor > 1000) {
|
|
141
|
-
throw new Error('Saldo insuficiente na operadora do cartao');
|
|
80
|
+
async function processarPagamento(dados: { userId: string; valor: number }) {
|
|
81
|
+
if (dados.valor > 10000) {
|
|
82
|
+
throw new Error('Limite excedido na operadora');
|
|
142
83
|
}
|
|
143
|
-
|
|
144
|
-
return 'Sucesso';
|
|
84
|
+
return 'aprovado';
|
|
145
85
|
}
|
|
146
86
|
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
userId: '123',
|
|
150
|
-
valor:
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
try {
|
|
156
|
-
const resultado = await dlq.execute(() => processarPagamento(payload), payload);
|
|
157
|
-
console.log('Resultado:', resultado);
|
|
158
|
-
} catch (erro) {
|
|
159
|
-
console.error('Erro de negocio capturado pela aplicacao:', (erro as Error).message);
|
|
160
|
-
}
|
|
87
|
+
try {
|
|
88
|
+
const resultado = await dlq.execute(
|
|
89
|
+
() => processarPagamento({ userId: 'u-123', valor: 15000 }),
|
|
90
|
+
{ userId: 'u-123', valor: 15000 },
|
|
91
|
+
);
|
|
92
|
+
} catch (err) {
|
|
93
|
+
// erro relançado normalmente — o SDK já registrou o evento
|
|
94
|
+
console.error((err as Error).message);
|
|
161
95
|
}
|
|
162
|
-
|
|
163
|
-
main();
|
|
164
96
|
```
|
|
165
97
|
|
|
166
|
-
|
|
98
|
+
---
|
|
167
99
|
|
|
168
|
-
|
|
169
|
-
2. O payload e criptografado localmente com AES-256.
|
|
170
|
-
3. O evento e colocado em uma fila em memoria.
|
|
171
|
-
4. O SDK envia o evento em background com autenticacao HMAC.
|
|
172
|
-
5. O erro original continua sendo relancado para o seu tratamento normal.
|
|
100
|
+
### `ReboundClient` + adapters — uso avançado
|
|
173
101
|
|
|
174
|
-
|
|
102
|
+
Para enviar eventos manualmente ou usar com adapters (HTTP, Kafka etc.).
|
|
175
103
|
|
|
176
104
|
```ts
|
|
177
105
|
import { ReboundClient, HTTPAdapter } from '@rebound-dlq/node';
|
|
@@ -183,10 +111,7 @@ const client = new ReboundClient({
|
|
|
183
111
|
const httpDlq = new HTTPAdapter(client);
|
|
184
112
|
|
|
185
113
|
await httpDlq.sendToDLQ({
|
|
186
|
-
payload: {
|
|
187
|
-
orderId: 'ORD-1001',
|
|
188
|
-
amount: 99.9,
|
|
189
|
-
},
|
|
114
|
+
payload: { orderId: 'ORD-1001', amount: 99.9 },
|
|
190
115
|
error: new Error('Payment gateway timeout'),
|
|
191
116
|
metadata: {
|
|
192
117
|
endpoint: '/api/payments',
|
|
@@ -196,110 +121,42 @@ await httpDlq.sendToDLQ({
|
|
|
196
121
|
});
|
|
197
122
|
```
|
|
198
123
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
### Falha de rede ou API indisponivel
|
|
124
|
+
**Parâmetros do `ReboundClient`:**
|
|
202
125
|
|
|
203
|
-
|
|
126
|
+
| Campo | Obrigatório | Descrição |
|
|
127
|
+
|---|---|---|
|
|
128
|
+
| `projectSecret` | ✅ Sim | Chave secreta do projeto, usada para autenticação e criptografia local. |
|
|
204
129
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
Quando a conta pode cobrar uso extra, a ingestao continua normalmente e o excedente e faturado pela plataforma na fatura Stripe da conta.
|
|
208
|
-
|
|
209
|
-
### Conta bloqueada por limite com `bill_extra` desativado
|
|
210
|
-
|
|
211
|
-
Quando a conta opta por **nao exceder o limite**:
|
|
212
|
-
|
|
213
|
-
- o SDK nao insiste em retry infinito para esse caso
|
|
214
|
-
- o evento atual e descartado
|
|
215
|
-
- novos eventos tambem sao descartados enquanto a conta continuar bloqueada
|
|
216
|
-
- o SDK consulta o estado da conta periodicamente e volta a enviar sozinho quando ela se tornar elegivel de novo
|
|
217
|
-
|
|
218
|
-
Esse comportamento existe para respeitar a decisao explicita da conta de nao gerar custo extra.
|
|
219
|
-
|
|
220
|
-
### Conta bloqueada por limite, mas com escolha de `bill_extra`
|
|
221
|
-
|
|
222
|
-
Quando a conta escolheu **aceitar cobranca extra** e a plataforma ainda responde com bloqueio temporario, o SDK assume que o cliente prefere **nao perder eventos** e usa um buffer temporario:
|
|
223
|
-
|
|
224
|
-
- os eventos ficam em um `blocked buffer` em memoria por ate **15 minutos**
|
|
225
|
-
- o buffer tem limite de **250 eventos por processo e por chave**
|
|
226
|
-
- o SDK faz polling autenticado a cada **60 segundos**
|
|
227
|
-
- quando a conta volta a ficar apta, os eventos buffered sao reenfileirados e enviados em ordem FIFO
|
|
228
|
-
|
|
229
|
-
Se a conta continuar bloqueada alem da janela de buffer, os eventos buffered expiram e sao descartados com log explicito.
|
|
230
|
-
|
|
231
|
-
## Observacao sobre `endpoint`
|
|
232
|
-
|
|
233
|
-
Prefira informar o `endpoint` como **URL base da API**. Exemplo recomendado:
|
|
234
|
-
|
|
235
|
-
```ts
|
|
236
|
-
endpoint: 'https://sua-api.com/api/v1'
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
Tambem funciona por compatibilidade:
|
|
240
|
-
|
|
241
|
-
```ts
|
|
242
|
-
endpoint: 'https://sua-api.com/api/v1/dlq-injestion'
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
O SDK adiciona internamente:
|
|
246
|
-
|
|
247
|
-
- `/dlq-injestion`
|
|
248
|
-
- `/dlq-injestion/runtime-state`
|
|
249
|
-
|
|
250
|
-
## Matriz de comportamento
|
|
251
|
-
|
|
252
|
-
| Situacao | Comportamento do SDK |
|
|
253
|
-
| --- | --- |
|
|
254
|
-
| `2xx` da API | remove o item da fila |
|
|
255
|
-
| falha de rede / `5xx` / erro transiente | retry com backoff exponencial |
|
|
256
|
-
| limite de plano com politica `block` | descarta enquanto bloqueado e reconsulta estado |
|
|
257
|
-
| limite de plano com escolha de `bill_extra`, mas bloqueio temporario | usa blocked buffer e reconsulta estado |
|
|
258
|
-
| conta liberada novamente | retoma automaticamente sem reiniciar o processo |
|
|
259
|
-
|
|
260
|
-
## O que o cliente precisa saber sobre limites e cobranca extra
|
|
261
|
-
|
|
262
|
-
Nao existe parametro novo no SDK para habilitar esse comportamento. Ele depende da configuracao da conta no Rebound DLQ:
|
|
263
|
-
|
|
264
|
-
- se a conta habilitar cobranca extra para eventos, a plataforma tenta continuar a ingestao e cobrar o excedente
|
|
265
|
-
- se a conta desabilitar cobranca extra, o SDK entende que pode haver perda de dados acima do limite e passa a descartar enquanto durar o bloqueio
|
|
266
|
-
- se a conta fizer upgrade ou alterar essa politica, o SDK detecta a mudanca automaticamente na proxima sincronizacao
|
|
267
|
-
|
|
268
|
-
Em outras palavras: **a decisao de produto e da conta; o SDK apenas executa essa politica automaticamente**.
|
|
269
|
-
|
|
270
|
-
## Observacoes operacionais importantes
|
|
271
|
-
|
|
272
|
-
- a fila do SDK e **in-memory**
|
|
273
|
-
- eventos pendentes ou buffered **nao sobrevivem** a restart do processo
|
|
274
|
-
- workloads de curta duracao ou ambientes muito efemeros podem perder eventos se o processo encerrar logo apos o enqueue
|
|
275
|
-
- para maior seguranca operacional, prefira rodar o SDK em processos com shutdown gracioso
|
|
276
|
-
- o SDK registra logs no console quando entra em modo de retry, descarte, buffer e retomada
|
|
277
|
-
|
|
278
|
-
## Compatibilidade com APIs antigas
|
|
279
|
-
|
|
280
|
-
Se a API de destino ainda nao suportar o contrato estruturado de bloqueio por limite, o SDK continua tratando respostas nao `2xx` como erros retryaveis. Ou seja: o fluxo novo de `buffer` e `discard` depende da API estar atualizada.
|
|
281
|
-
|
|
282
|
-
## FAQ rapido
|
|
130
|
+
---
|
|
283
131
|
|
|
284
|
-
|
|
132
|
+
## Comportamento automático
|
|
285
133
|
|
|
286
|
-
|
|
134
|
+
O SDK gerencia entrega, retry e limites de plano de forma totalmente automática, sem configuração adicional.
|
|
287
135
|
|
|
288
|
-
|
|
136
|
+
| Situação | O que o SDK faz |
|
|
137
|
+
|---|---|
|
|
138
|
+
| Sucesso na entrega | Remove o evento da fila |
|
|
139
|
+
| Falha de rede / erro transiente | Retry com backoff exponencial |
|
|
140
|
+
| Conta no limite (sem cobrança extra) | Descarta eventos e reconsulta o estado periodicamente |
|
|
141
|
+
| Conta no limite (com cobrança extra ativa) | Mantém eventos em buffer por até 15 min e retenta quando liberado |
|
|
142
|
+
| Conta desbloqueada / upgrade | Retoma o envio automaticamente, sem reiniciar o processo |
|
|
289
143
|
|
|
290
|
-
|
|
144
|
+
> A política de limite e cobrança extra é definida na sua conta na plataforma, não no SDK.
|
|
291
145
|
|
|
292
|
-
|
|
146
|
+
---
|
|
293
147
|
|
|
294
|
-
|
|
148
|
+
## Observações operacionais
|
|
295
149
|
|
|
296
|
-
|
|
150
|
+
- A fila é **in-memory**: eventos não sobrevivem a restart do processo.
|
|
151
|
+
- Para workloads efêmeros, prefira processos com **shutdown gracioso**.
|
|
152
|
+
- O SDK emite logs no console ao entrar em modo de retry, buffer ou descarte.
|
|
297
153
|
|
|
298
|
-
|
|
154
|
+
---
|
|
299
155
|
|
|
300
156
|
## Suporte
|
|
301
157
|
|
|
302
|
-
|
|
158
|
+
Dúvidas de integração ou comportamento? Abra um chamado pela plataforma oficial em [rebound-dlq.com](https://rebound-dlq.com).
|
|
303
159
|
|
|
304
160
|
---
|
|
161
|
+
|
|
305
162
|
Feito por **Codify Labs / Rebound DLQ**.
|