@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.
Files changed (2) hide show
  1. package/README.md +160 -0
  2. 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.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",