Skip to main content
validate() lanza errores tipados ante fallos HTTP o de red (un recurso inválido no lanza: se devuelve en result.errors). Todos extienden FhironError, así que puedes capturar cualquier fallo del SDK con un solo instanceof y luego distinguir el caso.
import { Fhiron, FhironError, FhironQuotaError, FhironAuthError } from '@fhiron/sdk';

try {
  await fhiron.validate(resource);
} catch (err) {
  if (err instanceof FhironQuotaError) {
    notificarUpgrade(err.upgradeUrl);
  } else if (err instanceof FhironAuthError) {
    pedirNuevaApiKey();
  } else if (err instanceof FhironError) {
    log.error('Fallo de Fhiron:', err.message);
  } else {
    throw err; // no es del SDK
  }
}

Jerarquía

ClaseHTTPCuándoReintentable
FhironAuthError401 / 403API key ausente, inválida o sin permisos.No
FhironQuotaError429Cuota mensual agotada. Expone .upgradeUrl.No (sube de plan)
FhironRequestError400 / 415 / 422Problema de forma del recurso o la petición.No
FhironServerError5xxServidor o motor de validación caído.
FhironTimeoutErrorn/aLa petición superó timeout. Expone .timeout.
FhironNetworkErrorn/aFallo de red, DNS, offline.
Todas exponen .status (cuando hay respuesta HTTP) y .body (el cuerpo crudo del error).

Patrón de reintento

Los errores marcados como reintentables (FhironServerError, FhironTimeoutError, FhironNetworkError) admiten un backoff simple:
import { FhironServerError, FhironTimeoutError, FhironNetworkError } from '@fhiron/sdk';

const RETRYABLE = [FhironServerError, FhironTimeoutError, FhironNetworkError];

async function validarConReintento(fhiron, resource, intentos = 3) {
  for (let i = 0; i < intentos; i++) {
    try {
      return await fhiron.validate(resource);
    } catch (err) {
      const esReintentable = RETRYABLE.some((C) => err instanceof C);
      if (!esReintentable || i === intentos - 1) throw err;
      await new Promise((r) => setTimeout(r, 500 * 2 ** i));
    }
  }
}
No reintentes ante FhironAuthError, FhironRequestError ni FhironQuotaError: el resultado no cambiará sin corregir la key, el recurso o el plan.

Recurso inválido no es un error

Importante: que un recurso no cumpla CL Core no lanza una excepción. La llamada resuelve con result.ok === false y los hallazgos en result.errors. Las excepciones son solo para fallos de transporte o autorización.