Saltar al contenido
nvíame
Capítulo 4 de 510 min26 sep 2026

Diseño de SDK clients

Cómo envolver una API de mensajería en un cliente que tu equipo quiera usar.

El SDK mx que usas en los playgrounds sigue patrones deliberados. Un buen cliente esconde HTTP, firma, reintentos y paginación detrás de una superficie pequeña y predecible.

Principios

  • Recursos como namespaces: sms, chat, otp, webhook.
  • Errores tipados: RateLimitError con retryAfter, ValidationError con el campo.
  • Defaults seguros: timeouts, reintentos idempotentes, TLS obligatorio.
  • Sin estado global: varias instancias con credenciales distintas deben convivir.
export class MessagingClient {
  constructor({ apiKey, baseUrl = "https://api.example.com", timeoutMs = 10000 }) {
    this.http = createHttp({ apiKey, baseUrl, timeoutMs });
    this.sms = { send: (input) => this.http.post("/v1/sms", validateSms(input)) };
  }
}

Un buen SDK no es una envoltura delgada sobre HTTP: es una interfaz que hace fácil lo correcto. Debe validar entradas antes de salir a la red, aplicar reintentos seguros por defecto, exponer errores tipados y nunca registrar secretos en sus logs.

Diseña la superficie pública pensando en el código que escribirá tu usuario. mx.sms.send({ to, text }) se lee como una frase; un método con siete argumentos posicionales obliga a consultar la documentación en cada uso.

Principios que sostienen un SDK

  • Objetos de opciones en lugar de argumentos posicionales: permiten agregar campos sin romper compatibilidad.
  • Errores tipados (ValidationError, RateLimitError) para que el llamador decida si reintentar.
  • Timeouts explícitos con valores por defecto razonables.
  • Versionado semántico estricto y changelog legible.

Cuando dudes entre agregar una opción o no, recuerda que cada opción pública es una promesa que deberás mantener durante años.

Se completa automáticamente al leer el 80%.

Comentarios (3)

Matías Herrera26 sep 2026

¿Clases o funciones para el SDK?

Equipo nvíameAutor26 sep 2026

Un cliente instanciable con configuración (`new Client({ apiKey })`) y recursos agrupados (`client.sms.send`) es el patrón más reconocible. Dentro, funciones puras y testeables.

Camila Rojas26 sep 2026

Lo apliqué en el proyecto del trabajo. La sección «Diseño de SDK clients» me ahorró una discusión larga con el equipo: ahora tenemos un criterio compartido.

Sofía Castillo26 sep 2026

¿Hay alguna diferencia importante si lo implemento en un servicio con varias instancias detrás de un balanceador?

Equipo nvíameAutor26 sep 2026

Sí: todo estado que hoy vive en memoria (contadores, sesiones, claves vistas) debe moverse a un almacén compartido con TTL, como Redis. Si no, cada instancia ve solo una parte de la historia.

Los comentarios se guardan solo en este navegador.