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)¶
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¶
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.