@ecdt/server-common 1.4.0 → 1.5.0
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 +33 -0
- package/package.json +2 -1
- package/src/index.d.ts +106 -68
package/README.md
CHANGED
|
@@ -155,3 +155,36 @@ app.listen(3000);
|
|
|
155
155
|
```
|
|
156
156
|
|
|
157
157
|
---
|
|
158
|
+
|
|
159
|
+
## TypeScript
|
|
160
|
+
|
|
161
|
+
O pacote publica os tipos em `src/index.d.ts` (declarado em `types` no `package.json`), tipados com `express` e `http`. **Não é necessário declarar `declare module '@ecdt/server-common'` na aplicação** — se você tem um arquivo desses em `src/@types/`, pode apagar: uma declaração ambiente local sombreia os tipos do pacote e passa a mentir em silêncio se as assinaturas divergirem.
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
import express from "express";
|
|
165
|
+
import http from "http";
|
|
166
|
+
import { expressCommonMiddlewares, expressCors, setupRedMetrics, setupGracefulShutdown } from "@ecdt/server-common";
|
|
167
|
+
|
|
168
|
+
const app = express();
|
|
169
|
+
|
|
170
|
+
app.use(...expressCommonMiddlewares()); // RequestHandler[]
|
|
171
|
+
app.use(expressCors({ econodataOrigins: true })); // RequestHandler
|
|
172
|
+
setupRedMetrics(app, { serviceName: "meu-ms" });
|
|
173
|
+
|
|
174
|
+
const server = http.createServer(app);
|
|
175
|
+
server.listen(3000);
|
|
176
|
+
setupGracefulShutdown(server, { onShutdown: () => pool.end() });
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
As interfaces de options são exportadas para reuso: `ExpressCommonMiddlewaresOptions`, `ExpressCorsOptions` (e sua base `ExpressCorsOptionsBase`), `GracefulShutdownOptions`, `RedMetricsOptions` e `MetricsRegistry`.
|
|
180
|
+
|
|
181
|
+
`ExpressCorsOptions` é uma união que exige `origins` e/ou `econodataOrigins: true` — sem nenhum dos dois o `expressCors` lança no boot, então o erro aparece já em compilação:
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
expressCors({ econodataOrigins: true }); // ok
|
|
185
|
+
expressCors({ methods: ["GET"] }); // erro TS2345 — lançaria no boot
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
`prom-client` aparece nos tipos como a interface estrutural `MetricsRegistry`, e não como `import` do pacote — assim quem não usa métricas compila sem tê-lo instalado.
|
|
189
|
+
|
|
190
|
+
---
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ecdt/server-common",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "Conjunto de ferramentas e configurações comuns nos servidores da Econodata",
|
|
5
5
|
"main": "src/index.js",
|
|
6
|
+
"types": "src/index.d.ts",
|
|
6
7
|
"scripts": {
|
|
7
8
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
8
9
|
},
|
package/src/index.d.ts
CHANGED
|
@@ -1,75 +1,113 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Nome(s) do cookie de sessão, em ordem de preferência.
|
|
5
|
-
* Quando omitido, o nome é resolvido por requisição a partir da origem (origin > referer > host):
|
|
6
|
-
* origens com subdomínio "hml" usam `hml-ecdt_token_site`, as demais usam `ecdt_token_site`.
|
|
7
|
-
*/
|
|
8
|
-
cookieName?: string | string[];
|
|
9
|
-
}
|
|
1
|
+
import type { Express, RequestHandler } from 'express';
|
|
2
|
+
import type { Server } from 'http';
|
|
10
3
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
): Array<(req: unknown, res: unknown, next: (err?: unknown) => void) => void>;
|
|
4
|
+
export interface ExpressCommonMiddlewaresOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Nome(s) do cookie de sessão, em ordem de preferência.
|
|
7
|
+
* Quando omitido, o nome é resolvido por requisição a partir da origem (origin > referer > host):
|
|
8
|
+
* origens com subdomínio "hml" usam `hml-ecdt_token_site`, as demais usam `ecdt_token_site`.
|
|
9
|
+
*/
|
|
10
|
+
cookieName?: string | string[];
|
|
11
|
+
}
|
|
20
12
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
/** Lista exata de métodos permitidos. Default: todos (GET, HEAD, PUT, PATCH, POST, DELETE, OPTIONS). */
|
|
31
|
-
methods?: string[];
|
|
32
|
-
}
|
|
13
|
+
/**
|
|
14
|
+
* Aplica bodyParser.text(), bodyParser.json(), bodyParser.urlencoded({extended: false}) e
|
|
15
|
+
* devMktTokenSanitaze() no middleware do express.
|
|
16
|
+
*
|
|
17
|
+
* Uso: app.use(...expressCommonMiddlewares())
|
|
18
|
+
*/
|
|
19
|
+
export declare function expressCommonMiddlewares(
|
|
20
|
+
options?: ExpressCommonMiddlewaresOptions
|
|
21
|
+
): RequestHandler[];
|
|
33
22
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
23
|
+
export interface ExpressCorsOptionsBase {
|
|
24
|
+
/** Origins permitidas (ex: ["https://app.econodata.com.br"]). */
|
|
25
|
+
origins?: string[];
|
|
26
|
+
/** Permite todas as origins https do domínio econodata.com.br (qualquer subdomínio). */
|
|
27
|
+
econodataOrigins?: boolean;
|
|
28
|
+
/** Headers adicionais além dos padrões (Authorization, Content-Type, X-Requested-With). */
|
|
29
|
+
extraHeaders?: string[];
|
|
30
|
+
/** Lista exata de headers permitidos — substitui os padrões. Não combinar com extraHeaders. */
|
|
31
|
+
headers?: string[];
|
|
32
|
+
/** Lista exata de métodos permitidos. Default: todos (GET, HEAD, PUT, PATCH, POST, DELETE, OPTIONS). */
|
|
33
|
+
methods?: string[];
|
|
34
|
+
}
|
|
41
35
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
/** Coletar métricas default do Node (heap, event loop, GC...). Default: true. */
|
|
50
|
-
collectDefaultMetrics?: boolean;
|
|
51
|
-
/** Registry alternativo do prom-client. Default: registry global. */
|
|
52
|
-
registry?: unknown;
|
|
53
|
-
}
|
|
36
|
+
/**
|
|
37
|
+
* Exige `origins` e/ou `econodataOrigins: true`: sem nenhum dos dois o expressCors lança no boot,
|
|
38
|
+
* então a união recusa em compilação o que o runtime já recusa.
|
|
39
|
+
*/
|
|
40
|
+
export type ExpressCorsOptions =
|
|
41
|
+
| (ExpressCorsOptionsBase & { origins: string[] })
|
|
42
|
+
| (ExpressCorsOptionsBase & { econodataOrigins: true });
|
|
54
43
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
* Requer `prom-client` instalado no microsserviço (peerDependency).
|
|
63
|
-
*
|
|
64
|
-
* Uso: setupRedMetrics(app, { serviceName: "dev-mkt-busca" })
|
|
65
|
-
*/
|
|
66
|
-
export function setupRedMetrics(app: unknown, options?: RedMetricsOptions): void;
|
|
44
|
+
/**
|
|
45
|
+
* Cria o middleware de CORS padrão dos servidores Econodata.
|
|
46
|
+
* Credentials sempre habilitado; origins não listadas não recebem headers CORS.
|
|
47
|
+
*
|
|
48
|
+
* Uso: app.use(expressCors({ origins: ["https://app.econodata.com.br"] }))
|
|
49
|
+
*/
|
|
50
|
+
export declare function expressCors(options: ExpressCorsOptions): RequestHandler;
|
|
67
51
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
52
|
+
export interface GracefulShutdownOptions {
|
|
53
|
+
/** Cleanup extra (fechar pools, Redis, etc.) executado após o server fechar. */
|
|
54
|
+
onShutdown?: () => void | Promise<void>;
|
|
55
|
+
/** Tempo máximo do graceful antes de forçar a saída. Default: 10000 (grace de 40s − 20s de preStop). */
|
|
56
|
+
failsafeTimeoutMs?: number;
|
|
57
|
+
}
|
|
72
58
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Registra o graceful shutdown padrão dos microsserviços em Kubernetes: em SIGTERM/SIGINT fecha o
|
|
61
|
+
* server, drena as conexões em voo, roda o onShutdown e encerra o processo.
|
|
62
|
+
*
|
|
63
|
+
* Uso: setupGracefulShutdown(server, { onShutdown: () => pool.end() })
|
|
64
|
+
*/
|
|
65
|
+
export declare function setupGracefulShutdown(
|
|
66
|
+
server: Server,
|
|
67
|
+
options?: GracefulShutdownOptions
|
|
68
|
+
): void;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Registry do prom-client, descrito estruturalmente para não acoplar a resolução destes tipos ao
|
|
72
|
+
* pacote: quem não usa métricas continua compilando sem `prom-client` instalado.
|
|
73
|
+
*/
|
|
74
|
+
export interface MetricsRegistry {
|
|
75
|
+
contentType: string;
|
|
76
|
+
metrics(): Promise<string>;
|
|
77
|
+
setDefaultLabels(labels: Record<string, string>): void;
|
|
78
|
+
getSingleMetric(name: string): unknown;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface RedMetricsOptions {
|
|
82
|
+
/** Nome do microsserviço. Vira o label `service` em todas as métricas. Fallback: env SERVICE_NAME > npm_package_name. */
|
|
83
|
+
serviceName?: string;
|
|
84
|
+
/** Caminho do endpoint de métricas. Default: '/metrics'. */
|
|
85
|
+
metricsPath?: string;
|
|
86
|
+
/** Buckets do histograma de latência, em segundos. */
|
|
87
|
+
buckets?: number[];
|
|
88
|
+
/** Coletar métricas default do Node (heap, event loop, GC...). Default: true. */
|
|
89
|
+
collectDefaultMetrics?: boolean;
|
|
90
|
+
/** Registry alternativo do prom-client. Default: registry global. */
|
|
91
|
+
registry?: MetricsRegistry;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Configura as métricas RED (Rate, Errors, Duration) no app express: registra o middleware de
|
|
96
|
+
* medição (antes das rotas) e o endpoint /metrics.
|
|
97
|
+
*
|
|
98
|
+
* Alimenta o histograma `http_request_duration_seconds{method,route,status_code}`, que habilita
|
|
99
|
+
* latência por endpoint, latência total, RPS, erros e top endpoints com erro.
|
|
100
|
+
*
|
|
101
|
+
* Requer `prom-client` instalado no microsserviço (peerDependency).
|
|
102
|
+
*
|
|
103
|
+
* Uso: setupRedMetrics(app, { serviceName: "dev-mkt-busca" })
|
|
104
|
+
*/
|
|
105
|
+
export declare function setupRedMetrics(app: Express, options?: RedMetricsOptions): void;
|
|
106
|
+
|
|
107
|
+
/** Middleware do express que alimenta o histograma `http_request_duration_seconds`. */
|
|
108
|
+
export declare function redMetricsMiddleware(
|
|
109
|
+
options?: Pick<RedMetricsOptions, 'buckets' | 'registry'>
|
|
110
|
+
): RequestHandler;
|
|
111
|
+
|
|
112
|
+
/** Handler do endpoint de métricas (exposição no formato Prometheus). */
|
|
113
|
+
export declare function metricsHandler(registry?: MetricsRegistry): RequestHandler;
|