@henriquecosta/chaos-api 1.0.0 → 1.0.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 +160 -0
- package/package.json +5 -1
package/README.md
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# @henriquecosta/chaos-api
|
|
2
|
+
|
|
3
|
+
Middleware pra simular falhas de produção — delay, erros, timeout, indisponibilidade, respostas malformadas/obsoletas — em APIs Express/Fastify/NestJS/Koa durante desenvolvimento.
|
|
4
|
+
|
|
5
|
+
Vem com control API + dashboard UI pra ligar/desligar cenários em tempo real, e um wrapper de `fetch` outbound pra injetar caos em chamadas que sua aplicação faz pra APIs de terceiros.
|
|
6
|
+
|
|
7
|
+
## Instalação
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @henriquecosta/chaos-api
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Início rápido (Express)
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import express from "express";
|
|
17
|
+
import { chaos } from "@henriquecosta/chaos-api";
|
|
18
|
+
|
|
19
|
+
const app = express();
|
|
20
|
+
const chaosMiddleware = chaos({ controlPort: 51820 });
|
|
21
|
+
|
|
22
|
+
app.use(chaosMiddleware);
|
|
23
|
+
|
|
24
|
+
app.get("/orders/:id", (req, res) => {
|
|
25
|
+
res.json({ id: req.params.id });
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
app.listen(3000);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Registre um cenário no store exposto pelo middleware:
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
chaosMiddleware.store.register({
|
|
35
|
+
type: "delay",
|
|
36
|
+
scope: { pattern: "/orders/*" },
|
|
37
|
+
rate: 0.5, // aplica em 50% das requisições que casam com o scope
|
|
38
|
+
options: { minMs: 300, maxMs: 1500 },
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Rode `npx chaos-api dashboard` e abra `http://localhost:4000/dashboard` pra alternar cenários visualmente em vez disso (ele fala com a `controlPort` acima).
|
|
43
|
+
|
|
44
|
+
## Adapters de framework
|
|
45
|
+
|
|
46
|
+
### Fastify
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import Fastify from "fastify";
|
|
50
|
+
import { chaosFastifyPlugin } from "@henriquecosta/chaos-api";
|
|
51
|
+
|
|
52
|
+
const fastify = Fastify();
|
|
53
|
+
const chaosPlugin = chaosFastifyPlugin({ controlPort: 51820 });
|
|
54
|
+
|
|
55
|
+
await fastify.register(chaosPlugin);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### NestJS
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
// main.ts
|
|
62
|
+
import { createChaosNestMiddleware } from "@henriquecosta/chaos-api";
|
|
63
|
+
|
|
64
|
+
app.use(createChaosNestMiddleware({ controlPort: 51820 }));
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Ou registre por módulo via `NestModule.configure()`:
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
consumer.apply(createChaosNestMiddleware()).forRoutes("*");
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Koa
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import Koa from "koa";
|
|
77
|
+
import { chaosKoaMiddleware } from "@henriquecosta/chaos-api";
|
|
78
|
+
|
|
79
|
+
const app = new Koa();
|
|
80
|
+
app.use(chaosKoaMiddleware({ controlPort: 51820 }));
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Tipos de cenário
|
|
84
|
+
|
|
85
|
+
Seis primitivos, casados por caminho da requisição (`scope`) e probabilidade (`rate`):
|
|
86
|
+
|
|
87
|
+
| type | efeito |
|
|
88
|
+
| -------------------- | ----------------------------------------------------------------- |
|
|
89
|
+
| `delay` | Adiciona latência antes de continuar a requisição (`minMs`/`maxMs`). |
|
|
90
|
+
| `error-response` | Interrompe com status/body (`statusCodes`, `body`, `headers`, `methods`). |
|
|
91
|
+
| `connection-reset` | Derruba a conexão — nenhuma resposta é escrita. |
|
|
92
|
+
| `unavailable` | Retorna um status fixo de indisponibilidade (`statusCode`, padrão 503). |
|
|
93
|
+
| `malformed-response` | Retorna um body de resposta estruturalmente quebrado. |
|
|
94
|
+
| `stale-response` | Retorna um body de resposta em cache/desatualizado. |
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
chaosMiddleware.store.register({
|
|
98
|
+
type: "error-response",
|
|
99
|
+
scope: { pattern: "/payments/*" },
|
|
100
|
+
direction: "inbound", // padrão; "outbound" escopa pelo host de destino em vez do path
|
|
101
|
+
rate: 0.2,
|
|
102
|
+
options: { statusCodes: [500, 502], body: { error: "payment provider unavailable" } },
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Use `scope: "global"` (padrão) pra aplicar um cenário em todas as rotas.
|
|
107
|
+
|
|
108
|
+
## Presets
|
|
109
|
+
|
|
110
|
+
Catálogo com ~85 itens de cenários nomeados e pré-configurados (queda de auth, timeout de terceiros, erro de config etc.) mapeados sobre os seis primitivos acima:
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
import { applyPreset, listPresets } from "@henriquecosta/chaos-api";
|
|
114
|
+
|
|
115
|
+
listPresets("dependencias-externas"); // navega por categoria
|
|
116
|
+
|
|
117
|
+
applyPreset(chaosMiddleware.store, "third-party-rate-limit", {
|
|
118
|
+
scope: { pattern: "/checkout/*" },
|
|
119
|
+
rate: 0.3,
|
|
120
|
+
});
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Caos outbound (chamadas que sua aplicação faz)
|
|
124
|
+
|
|
125
|
+
Envolva o `fetch` pra que cenários registrados com `direction: "outbound"` intercepetem chamadas pra um host de destino:
|
|
126
|
+
|
|
127
|
+
```ts
|
|
128
|
+
import { createChaosFetch } from "@henriquecosta/chaos-api";
|
|
129
|
+
|
|
130
|
+
const chaosFetch = createChaosFetch(chaosMiddleware.store);
|
|
131
|
+
|
|
132
|
+
chaosMiddleware.store.register({
|
|
133
|
+
type: "connection-reset",
|
|
134
|
+
direction: "outbound",
|
|
135
|
+
scope: { pattern: "api.stripe.com" },
|
|
136
|
+
rate: 0.1,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
await chaosFetch("https://api.stripe.com/v1/charges"); // pode lançar uma falha de rede simulada
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Guardrail de produção
|
|
143
|
+
|
|
144
|
+
Cenários são desabilitados automaticamente quando `NODE_ENV=production`, pra evitar que um cenário ativo vaze pro tráfego real. Override (não recomendado) com:
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
chaos({ allowInProduction: true });
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## CLI do dashboard
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
npx chaos-api dashboard [--port <n>] [--control-port <n>] [--no-control-api]
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Serve a UI do dashboard (padrão `http://localhost:4000/dashboard`). Por padrão também sobe uma control API standalone pra demo; passe `--no-control-api` quando sua aplicação já roda `chaos({ controlPort })` e você só quer a UI.
|
|
157
|
+
|
|
158
|
+
## Licença
|
|
159
|
+
|
|
160
|
+
MIT
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@henriquecosta/chaos-api",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"license": "MIT",
|
|
4
5
|
"description": "Middleware pra simular falhas de producao (delay, erros, timeout, indisponibilidade, respostas malformadas/obsoletas) em APIs Express/Fastify/NestJS/Koa durante desenvolvimento.",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"main": "./dist/index.js",
|
|
@@ -11,6 +12,9 @@
|
|
|
11
12
|
"files": [
|
|
12
13
|
"dist"
|
|
13
14
|
],
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
14
18
|
"exports": {
|
|
15
19
|
".": {
|
|
16
20
|
"types": "./dist/index.d.ts",
|