Saltar al contenido principal
Diseñado para claridad y escalabilidad, el SDK te permite trabajar con Organizations, Ledgers, Accounts, Transactions y más, ya sea que estés creando un flujo de trabajo simple o gestionando operaciones complejas. En su núcleo, el SDK está construido sobre una arquitectura modular en capas que prioriza el rendimiento, la extensibilidad y una excelente experiencia de desarrollador.

¿Por qué usar el Midaz SDK for TypeScript?

  • Seguro por diseño: Construido con soporte completo de TypeScript y definiciones de tipo precisas.
  • Builder pattern: Interfaces fluidas y legibles para ayudarte a construir objetos complejos con facilidad.
  • Manejo robusto de errores: Estrategias de recuperación inteligentes y señales de error claras, para que mantengas el control.
  • Observabilidad incluida: Tracing, métricas y logs, listos desde el inicio.
  • Arquitectura en capas: Separación limpia entre cliente, entidades, API y modelos. Organizado, predecible, escalable.
  • Reintentos automáticos: Maneja contratiempos transitorios con políticas de reintento configurables.
  • Controles de concurrencia: Herramientas incorporadas para ejecutar tareas en paralelo, sin perder el control del throughput.
  • Rápido con caché: Caché en memoria para mejorar el rendimiento donde cuenta.
  • Validación estricta: Captura entrada inválida temprano con mensajes de error claros y accionables.

Empezando

Prerequisito

  • El Midaz SDK for TypeScript requiere TypeScript v5.8 o posterior.

Instalando el SDK

Para comenzar a usar el Midaz SDK for TypeScript, debes instalar las dependencias usando el siguiente comando:
npm install midaz-sdk
Una vez instalado, sigue los ejemplos en la sección Guía de inicio rápido para aprender cómo usar el Midaz SDK for TypeScript.

Autenticación

El Midaz SDK for TypeScript te da flexibilidad cuando se trata de autenticación. Puedes elegir el método que se ajuste a tu configuración:

API key

Puedes usar un método de autenticación simple agregando una API Key.
const client = createClient({
  apiKey: 'your-api-key',
  environment: 'sandbox',
});

Autenticación con Access Manager

Para integración con proveedores de identidad externos usando OAuth:
const client = createClient({
  accessManager: {
    enabled: true,
    address: 'https://auth.example.com',
    clientId: 'your-client-id',
    clientSecret: 'your-client-secret',
  },
  environment: 'sandbox',
});
El Access Manager maneja el manejo de tokens por ti, como adquisición, almacenamiento en caché y renovación, para que no tengas que preocuparte por gestionar tokens manualmente.
TipOfrecemos un plugin Access Manager que puedes usar. Si deseas saber más al respecto, contáctanos.

Guía de inicio rápido

En las siguientes secciones, encontrarás ejemplos de código prácticos para ayudarte a entender cómo usar el Midaz SDK for TypeScript.

Crear un cliente

Este es el primer, y posiblemente más importante, paso. El cliente es tu punto de entrada principal al SDK. Maneja la autenticación y te da acceso a todos los servicios de entidades. Ejemplo:
import { createClient } from 'midaz-sdk';

const client = createClient({
  apiKey: 'your-api-key',
  environment: 'sandbox', // Options: 'development', 'sandbox', 'production'
});

Crear un Activo

La mejor manera de crear assets es con el Builder Pattern usando createAssetBuilder. Ejemplo:
import { createAssetBuilder } from 'midaz-sdk';

const assetInput = createAssetBuilder('US Dollar', 'USD')
  .withType('currency')
  .withMetadata({ precision: 2, symbol: '$' })
  .build();

const asset = await client.entities.assets.createAsset('org_123', 'ledger_456', assetInput);
En este código, agregarás los campos requeridos name y assetCode al builder const assetInput = createAssetBuilder('US Dollar', 'USD'), luego agregarás cualquier propiedad adicional con métodos with*.

Crear una Cuenta

La forma más fácil de crear cuentas es con el Builder Pattern usando createAccountBuilder. Ejemplo:
import { createAccountBuilder } from 'midaz-sdk';

const accountInput = createAccountBuilder('Savings Account', 'USD')
  .withType('savings')
  .withAlias('personal-savings')
  .build();

const account = await client.entities.accounts.createAccount('org_123', 'ledger_456', accountInput);
En este código, agregarás los campos requeridos name y assetCode al builder const accountInput = createAccountBuilder('Savings Account', 'USD'), luego agregarás cualquier propiedad adicional con métodos with*.

Crear una Transacción

La forma más fácil de crear cuentas es con el Builder Pattern usando createTransactionBuilder. Ejemplo:
import { createTransactionBuilder } from 'midaz-sdk';

const transactionInput = createTransactionBuilder()
  .withCode('payment_001')
  .withOperations([
    {
      accountId: 'source_account_id',
      assetCode: 'USD',
      amount: 100 * 100, // $100.00
      type: 'debit',
    },
    {
      accountId: 'destination_account_id',
      assetCode: 'USD',
      amount: 100 * 100, // $100.00
      type: 'credit',
    },
  ])
  .withMetadata({ purpose: 'Monthly payment' })
  .build();
En este código, agregarás todas las propiedades con métodos with*.

Recuperación de errores

Usa recuperación mejorada de errores para operaciones críticas
import { withEnhancedRecovery } from 'midaz-sdk/util/error';

const result = await withEnhancedRecovery(
  () => client.entities.transactions.createTransaction('org_123', 'ledger_456', transactionInput),
  {
    maxRetries: 3,
    enableSmartRecovery: true,
  }
);

Limpiar recursos

client.close();

Usando Access Manager para autenticación

import { createClientConfigWithAccessManager, MidazClient } from 'midaz-sdk';

// Initialize the client with Access Manager authentication
const client = new MidazClient(
  createClientConfigWithAccessManager({
    address: 'https://auth.example.com', // Identity provider address
    clientId: 'your-client-id', // OAuth client ID
    clientSecret: 'your-client-secret', // OAuth client secret
    tokenEndpoint: '/oauth/token', // Optional, defaults to '/oauth/token'
    refreshThresholdSeconds: 300, // Optional, defaults to 300 (5 minutes)
  })
    .withEnvironment('sandbox')
    .withApiVersion('v1')
);

// The SDK will automatically handle token acquisition and renewal
// You can now use the client as normal
const organizations = await client.entities.organizations.listOrganizations();

// For environment-specific configurations with Access Manager
const sandboxClient = new MidazClient(
  createSandboxConfigWithAccessManager({
    address: 'https://auth.example.com',
    clientId: 'your-client-id',
    clientSecret: 'your-client-secret',
  })
);

// Clean up resources when done
client.close();

Arquitectura del SDK

El Midaz SDK usa una arquitectura de servicio multi-capa para proporcionar una experiencia de desarrollador limpia, modular y escalable. Está organizado en tres capas clave, como se muestra en la Figura 1, cada una sirviendo un propósito distinto.
  • Client interface: Este es el punto de entrada principal para los usuarios del SDK. Gestiona configuraciones como claves API y entornos, inicializa servicios de manera lazy y expone toda la funcionalidad disponible de manera unificada y descubrible.
  • Entity services layer: Esta capa contiene servicios específicos de dominio (por ejemplo, Accounts, Assets y Transactions) y ofrece métodos consistentes para operaciones como create, get, update, delete y list. Además, se incluyen operaciones especializadas basadas en las necesidades específicas de cada entidad.
  • Core services layer: Estas utilidades fundamentales son usadas por todos los servicios de entidades. Manejan solicitudes HTTP, validación de entrada, procesamiento de errores, observabilidad, configuración y caché.

Figura 1. La arquitectura en capas del Midaz SDK for TypeScript.

La arquitectura del SDK enfatiza:
  • Consistencia a través de patrones compartidos entre servicios.
  • Escalabilidad vía inyección de dependencias y factories de servicio.
  • Confiabilidad a través de manejo mejorado de errores y respuestas tipadas.
  • Testabilidad con soporte para pruebas de mock, integración y contrato.
Tip¿Quieres profundizar? Consulta las siguientes páginas para más información sobre la Arquitectura:

Builder pattern

El Midaz SDK for TypeScript emplea un patrón de diseño builder para ayudarte a ensamblar objetos avanzados de manera directa, segura y adaptable. En lugar de predefinir un conjunto de entradas, proporciona una interfaz fluida, encadenable y paso a paso que te guía a través de todo el proceso. Funciones builder en el SDK:
  • Te asisten informándote de los parámetros por adelantado.
  • Te permiten modificar campos opcionales usando métodos .with*() y encadenarlos.
  • Ayudan a evitar estados inválidos a través de una estructura guiada.
  • Ocultan la complejidad interna, lo que conduce a mejor legibilidad.

Ejemplo

Aquí hay un ejemplo rápido:
const assetInput = createAssetBuilder('USD Currency', 'USD')
  .withType('currency')
  .withMetadata({ precision: 2 })
  .build();
Luego puedes pasar este assetInput al método de creación correspondiente en el SDK.
Tip¿Quieres profundizar? Consulta la página de Builder Pattern en Midaz SDK para más información.

Trabajando con entidades

Cada servicio de entidad se concentra en aspectos distintos del dominio financiero, como cuentas, assets o transacciones. Estos servicios proporcionan un método confiable para crear, recuperar, actualizar y eliminar datos mientras permiten interacciones significativas con cada tipo de entidad. Además, ofrecen características especializadas diseñadas para su caso de uso particular, permitiéndote manejar datos financieros con mayor confianza y eficiencia.
EntidadDescripción
OrganizacionesGestionar unidades de negocio y datos organizacionales.
LedgersEstructurar y gestionar registros financieros.
ActivosTrabajar con assets como monedas, commodities y otras unidades de valor.
CuentasCrear, recuperar, actualizar y eliminar cuentas dentro de un Ledger.
SegmentosOrganizar portfolios para análisis y reportes.
PortafoliosAgrupar cuentas y assets en colecciones financieras significativas.
SaldosRecuperar y calcular saldos de assets para cuentas.
Tasas de activosManejar tasas de cambio entre diferentes tipos de assets.
TransaccionesCrear y gestionar transacciones que mueven assets entre cuentas.
OperacionesGestionar débitos y créditos atómicos que componen una transacción.
Puedes acceder a cada uno de estos servicios a través del cliente SDK. Siguen una estructura consistente, facilitando la construcción y mantenimiento de características financieras.
¿Quieres profundizar? Consulta las páginas de Entities para más información.

Usando utilidades

El SDK proporciona un conjunto de módulos de utilidad para agilizar operaciones comunes, ya sea optimizando rendimiento, manejando errores, gestionando configuraciones o mejorando la observabilidad. Estas herramientas están diseñadas para trabajar sin problemas con el resto del SDK y te ayudan a construir aplicaciones financieras robustas con menos esfuerzo.
UtilidadDescripción
Ayudantes de CuentaSimplifica la lógica común relacionada con cuentas y transformaciones.
CachéHabilita caché ligero para mejor rendimiento en tiempo de ejecución.
ConcurrenciaAyuda a coordinar y limitar tareas concurrentes de manera segura y eficiente.
ConfigConfiguración centralizada y acceso.
DatosAsiste con formateo de datos y tareas de paginación.
Manejo de erroresOfrece estrategias de recuperación y mecanismos de procesamiento de errores.
Cliente HTTPProporciona una interfaz HTTP de bajo nivel para llamadas API directas.
RedAgrega características de red de alto nivel como reintentos y backoff.
ObservabilidadCaptura traces, métricas y logs para soportar monitoreo y depuración.
PaginaciónManeja respuestas paginadas con helpers predecibles y consistentes.
ValidaciónValida datos de entrada y salida para ayudar a mantener la integridad de datos.
¿Quieres profundizar? Consulta las páginas de Utilities para más información.

Manejo de errores

El Midaz SDK for TypeScript te ayuda a manejar errores de manera clara y consistente. Cuando ocurre un error durante una operación del SDK, se lanza un error estructurado. Este error incluye campos clave para ayudarte a entender y resolver el problema:
  • code: Un identificador corto y consistente para el tipo de error.
  • message: Una descripción legible para humanos.
  • details: (Opcional) Contexto adicional o metadata.
  • status: El código de estado HTTP, cuando esté disponible.
Aquí hay cómo podrías manejar un error:
try {
  await client.transactions.create(transaction);
} catch (err) {
  console.error(`Error (${err.code}): ${err.message}`);
  // Opcionalmente: inspecciona err.details o err.status
}

Códigos de error comunes

CódigoDescripciónEstado HTTP
invalid_inputTu solicitud falta datos requeridos o tiene valores inválidos.400
unauthorizedLa autenticación falló o las credenciales están faltando.401
forbiddenNo tienes permiso para realizar esta acción.403
not_foundEl recurso que intentas acceder no existe.404
conflictLa operación entra en conflicto con un recurso existente.409
internal_errorAlgo salió mal de nuestro lado.500
service_unavailableInterrupción temporal, intenta de nuevo más tarde.503

Mejores prácticas

  • Valida entrada antes de llamar métodos del SDK para evitar invalid_input.
  • Verifica autenticación cuando enfrentes unauthorized o forbidden.
  • Reintenta en problemas transitorios como internal_error o service_unavailable.
  • Usa details para mostrar información útil de depuración en logs de desarrollo.
El SDK está construido para mantener los errores predecibles y accionables, para que puedas enfocarte en construir, no en depurar.
¿Quieres profundizar? Consulta las siguientes páginas para más información:

Pipeline CI/CD

Usamos GitHub Actions para mantener las cosas fluidas, automatizadas y listas para producción:
  • Ejecuta pruebas en múltiples versiones de Node.js.
  • Aplica calidad de código con ESLint y Prettier.
  • Mantiene las dependencias actualizadas con Dependabot.
  • Maneja releases automáticamente usando versionado semántico.
  • Genera changelogs para transparencia completa.

¿Quieres contribuir?

Si estás pensando en contribuir al Midaz SDK for TypeScript, comienza con nuestra guía de contribución en GitHub. Cubre todo lo que necesitas saber para comenzar.

Licencia

Este proyecto está licenciado bajo Apache 2.0. Para detalles, consulta la página de License.