Ir para o conteúdo

MFA, HTTP client, Web Push e mais

Utilidades de servidor prontas para produção.

MFA (TOTP)

TOTPHelper é nativo (node:crypto, RFC 6238) — sem dependência externa.

import { TOTPHelper } from "tempest-express-sdk";

const totp = new TOTPHelper({ issuer: "Minha App" });
const secret = totp.generateSecret();                     // persista no usuário
const uri = totp.provisioningUri(secret, "ana@example.com"); // renderize como QR
totp.verify(secret, "123456");                            // true / false (janela ±1)

HTTP client resiliente

HTTPClient embrulha o fetch nativo com retry (backoff) + circuit breaker por host.

import { HTTPClient, RetryPolicy } from "tempest-express-sdk";

const http = new HTTPClient({
  baseUrl: "https://api.exemplo.com",
  retryPolicy: new RetryPolicy(3, 200),   // 3 tentativas, backoff base 200ms
  breakerThreshold: 5,                     // abre após 5 falhas seguidas
});

const res = await http.get("/status");

Web Push (VAPID)

Peer opcional

npm install web-push
import { WebPushDispatcher, WebPushGoneError } from "tempest-express-sdk";

const push = new WebPushDispatcher({
  subject: "mailto:admin@exemplo.com",
  publicKey: process.env.VAPID_PUBLIC!,
  privateKey: process.env.VAPID_PRIVATE!,
});

try {
  await push.send(subscription, { title: "Olá", body: "Nova mensagem" });
} catch (err) {
  if (err instanceof WebPushGoneError) await removeSubscription(subscription);
}

Email

Peer opcional

npm install nodemailer
import { EmailUtils } from "tempest-express-sdk";

const email = new EmailUtils({
  host: "smtp.exemplo.com",
  user: "no-reply@exemplo.com",
  password: process.env.SMTP_PASS!,
  from: "no-reply@exemplo.com",
});

await email.send({ to: "ana@example.com", subject: "Bem-vinda", html: "<b>Oi</b>" });

Métricas

MetricsUtils lê CPU/memória/uptime do node:os/process, com exporter Prometheus. Use makeMetricsRouter para expor /metrics direto:

import { makeMetricsRouter } from "tempest-express-sdk";

app.use(makeMetricsRouter({ includeGpu: true }));
// GET /metrics → text/plain Prometheus (CPU, memória, uptime + GPU quando houver)

GPU é opcional e sem dependência — includeGpu chama nvidia-smi por baixo e retorna [] quando ausente (adiciona gauges gpu_utilization_percent{gpu="N"}, gpu_memory_used_mb, gpu_temperature_celsius). Passe um guard para manter o endpoint na rede interna. Também dá pra renderizar manualmente:

import { MetricsUtils } from "tempest-express-sdk";
const text = MetricsUtils.toPrometheus(MetricsUtils.system(), await MetricsUtils.gpus());

Client IP confiável

import { getClientIp } from "tempest-express-sdk";

// Atrás de proxy: confie APENAS no header que a edge define (nunca X-Forwarded-For cru).
const ip = getClientIp(req, { trustedHeader: "x-real-ip" });

Recapitulando

MFA nativo, HTTP client resiliente, Web Push/email (peers opcionais), métricas Prometheus e resolução de IP segura — as peças de servidor que faltavam.