@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.
Files changed (3) hide show
  1. package/README.md +33 -0
  2. package/package.json +2 -1
  3. 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.4.0",
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
- declare module '@ecdt/server-common' {
2
- export interface ExpressCommonMiddlewaresOptions {
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
- * Aplica bodyParser.text(), bodyParser.json(), bodyParser.urlencoded({extended: false}) e devMktTokenSanitaze()
13
- * no middleware do express.
14
- *
15
- * Uso: app.use(...expressCommonMiddlewares())
16
- */
17
- export function expressCommonMiddlewares(
18
- options?: ExpressCommonMiddlewaresOptions
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
- export interface ExpressCorsOptions {
22
- /** Origins permitidas (ex: ["https://app.econodata.com.br"]). Obrigatório se econodataOrigins não for true. */
23
- origins?: string[];
24
- /** Permite todas as origins https do domínio econodata.com.br (qualquer subdomínio). */
25
- econodataOrigins?: boolean;
26
- /** Headers adicionais além dos padrões (Authorization, Content-Type, X-Requested-With). */
27
- extraHeaders?: string[];
28
- /** Lista exata de headers permitidos — substitui os padrões. Não combinar com extraHeaders. */
29
- headers?: string[];
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
- * Cria o middleware de CORS padrão dos servidores Econodata.
36
- * Credentials sempre habilitado; origins não listadas não recebem headers CORS.
37
- *
38
- * Uso: app.use(expressCors({ origins: ["https://app.econodata.com.br"] }))
39
- */
40
- export function expressCors(options: ExpressCorsOptions): (req: unknown, res: unknown, next: (err?: unknown) => void) => void;
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
- export interface RedMetricsOptions {
43
- /** Nome do microsserviço. Vira o label `service` em todas as métricas. Fallback: env SERVICE_NAME > npm_package_name. */
44
- serviceName?: string;
45
- /** Caminho do endpoint de métricas. Default: '/metrics'. */
46
- metricsPath?: string;
47
- /** Buckets do histograma de latência, em segundos. */
48
- buckets?: number[];
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
- * Configura as métricas RED (Rate, Errors, Duration) no app express: registra o
57
- * middleware de medição (antes das rotas) e o endpoint /metrics.
58
- *
59
- * Alimenta o histograma `http_request_duration_seconds{method,route,status_code}`,
60
- * que habilita latência por endpoint, latência total, RPS, erros e top endpoints com erro.
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
- /** Middleware do express que alimenta o histograma `http_request_duration_seconds`. */
69
- export function redMetricsMiddleware(
70
- options?: Pick<RedMetricsOptions, "buckets" | "registry">
71
- ): (req: unknown, res: unknown, next: (err?: unknown) => void) => void;
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
- /** Handler do endpoint de métricas (exposição no formato Prometheus). */
74
- export function metricsHandler(registry?: unknown): (req: unknown, res: unknown) => void;
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;