@dynamicore/jumio-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/envelope.ts","../../src/core/errors.ts","../../src/core/http.ts","../../src/core/image.ts","../../src/core/retry.ts","../../src/core/polling.ts","../../src/core/client.ts","../../src/react/useJumioVerification.ts"],"names":["finalResult"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { JumioVerificationData } from \"./types\";\n\n/**\n * Lista de estados considerados finales en el flujo de Jumio.\n */\nexport const FINAL_JUMIO_STATUSES = [\n \"PROCESSED\",\n \"APPROVED_VERIFIED\",\n \"REJECTED\",\n \"FAILED\",\n \"ERROR\",\n \"DENIED\",\n \"EXPIRED\",\n \"ABANDONED\",\n \"DONE\",\n \"COMPLETED\",\n \"NOT_READABLE\",\n \"FRAUD\",\n \"UNSUPPORTED_ID_TYPE\",\n] as const;\n\n/**\n * Lista de estados considerados exitosos (aprobados) de forma inequívoca.\n *\n * Nota: `PROCESSED` no se considera aprobado por sí solo: en la gateway\n * DynamiCore/Jumio significa únicamente que el workflow terminó de procesar.\n * El veredicto real se reporta en los campos `valid` y `decision`\n * (p. ej. `decision: \"NOT_EXECUTED\"` con `workflowStatus: \"PROCESSED\"` es un rechazo).\n */\nexport const APPROVED_JUMIO_STATUSES = [\n \"APPROVED_VERIFIED\",\n \"DONE\",\n \"COMPLETED\",\n] as const;\n\n/**\n * Convierte un valor a texto en minúsculas sin espacios extremos.\n */\nexport function toLowerText(value: unknown): string {\n return String(value ?? \"\")\n .trim()\n .toLowerCase();\n}\n\n/**\n * Convierte un valor a texto en mayúsculas sin espacios extremos.\n */\nexport function toUpperText(value: unknown): string {\n return String(value ?? \"\")\n .trim()\n .toUpperCase();\n}\n\n/**\n * Desempaqueta el envoltorio estándar `{ data: ... }` si está presente en la respuesta.\n */\nexport function extractEnvelopeData<T>(responseData: unknown): T {\n if (\n responseData &&\n typeof responseData === \"object\" &&\n \"data\" in responseData\n ) {\n const candidate = (responseData as { data?: unknown }).data;\n if (candidate !== undefined) {\n return candidate as T;\n }\n }\n return responseData as T;\n}\n\n/**\n * Desempaqueta recursivamente múltiples niveles de anidación `{ data: { data: ... } }`.\n */\nexport function extractNestedData(source: unknown, maxDepth = 4): unknown {\n let current = source;\n let depth = 0;\n\n while (\n depth < maxDepth &&\n current &&\n typeof current === \"object\" &&\n \"data\" in (current as Record<string, unknown>)\n ) {\n const next = (current as { data?: unknown }).data;\n if (next == null) break;\n current = next;\n depth += 1;\n }\n\n return current;\n}\n\n/**\n * Extrae de forma inteligente el mensaje de error o descripción contenido en una respuesta de Jumio o Axios.\n */\nexport function extractJumioMessage(source: unknown): string {\n if (!source) return \"\";\n if (typeof source === \"string\") return source.trim();\n\n if (source instanceof Error) {\n return source.message;\n }\n\n if (typeof source === \"object\") {\n const record = source as Record<string, unknown>;\n\n // Caso respuesta Axios con error.response.data\n if (record.response && typeof record.response === \"object\") {\n const responseObj = record.response as { data?: unknown };\n const subMessage = extractJumioMessage(responseObj.data);\n if (subMessage) return subMessage;\n }\n\n const directCandidates = [\n record.message,\n record.msg,\n record.error,\n record.detail,\n record.errorMessage,\n record.description,\n record.reason,\n ];\n\n for (const cand of directCandidates) {\n if (typeof cand === \"string\" && cand.trim()) {\n return cand.trim();\n }\n }\n\n if (record.data) {\n return extractJumioMessage(record.data);\n }\n }\n\n return \"\";\n}\n\n/**\n * Determina si el estado de workflow reportado por Jumio es definitivo (ha terminado su procesamiento).\n */\nexport function isFinalJumioStatus(status: unknown): boolean {\n const upperStatus = toUpperText(status);\n if (!upperStatus) return false;\n\n return FINAL_JUMIO_STATUSES.some((s) => s === upperStatus);\n}\n\n/**\n * Determina si el estado reportado indica una verificación aprobada y válida.\n */\nexport function isApprovedJumioStatus(status: unknown): boolean {\n const upperStatus = toUpperText(status);\n if (!upperStatus) return false;\n\n return (\n upperStatus === \"APPROVED_VERIFIED\" ||\n upperStatus === \"DONE\" ||\n upperStatus === \"COMPLETED\"\n );\n}\n\n/**\n * Determina si la decisión final de Jumio indica un documento aprobado.\n * La decisión es el veredicto real reportado por la gateway\n * (p. ej. `PASSED` = aprobado, `NOT_EXECUTED` / `REJECTED` / `FAILED` = rechazado).\n */\nexport function isPassedJumioDecision(decision: unknown): boolean {\n return toUpperText(decision) === \"PASSED\";\n}\n\n/**\n * Resuelve la validez final de una verificación priorizando los campos\n * explícitos (`valid`, `decision`) sobre el estado del workflow:\n *\n * 1. `valid` booleano explícito (fuente de verdad de la gateway).\n * 2. `decision` presente (`PASSED` = válido, cualquier otro valor = inválido).\n * 3. Fallback conservador basado en el estado del workflow.\n */\nexport function resolveVerificationValidity(\n data: Pick<JumioVerificationData, \"valid\" | \"decision\">,\n fallbackStatus: unknown\n): boolean {\n if (typeof data.valid === \"boolean\") {\n return data.valid;\n }\n\n if (data.decision) {\n return isPassedJumioDecision(data.decision);\n }\n\n return isApprovedJumioStatus(fallbackStatus);\n}\n","/**\n * Error base para todas las excepciones emitidas por el SDK de Jumio.\n */\nexport class JumioError extends Error {\n public readonly isJumioError = true;\n public readonly statusCode?: number;\n public readonly rawData?: unknown;\n public readonly code?: string;\n\n constructor(message: string, options?: { statusCode?: number; rawData?: unknown; code?: string; cause?: unknown }) {\n super(message);\n this.name = \"JumioError\";\n this.statusCode = options?.statusCode;\n this.rawData = options?.rawData;\n this.code = options?.code;\n if (options?.cause) {\n this.cause = options.cause;\n }\n }\n}\n\n/**\n * Error lanzado ante demoras excesivas o timeouts del servicio de verificación.\n */\nexport class JumioTimeoutError extends JumioError {\n constructor(message = \"El servicio de verificación de Jumio excedió el tiempo límite de espera.\", rawData?: unknown) {\n super(message, { code: \"TIMEOUT\", rawData });\n this.name = \"JumioTimeoutError\";\n }\n}\n\n/**\n * Error lanzado cuando no hay conectividad de red o falla el transporte HTTP.\n */\nexport class JumioNetworkError extends JumioError {\n constructor(message = \"No fue posible comunicarse con los servidores de validación de identidad.\", cause?: unknown) {\n super(message, { code: \"NETWORK_ERROR\", cause });\n this.name = \"JumioNetworkError\";\n }\n}\n\n/**\n * Error lanzado cuando la validación del documento es rechazada o no pasa los criterios.\n */\nexport class JumioValidationError extends JumioError {\n constructor(message = \"El documento no pudo ser validado o fue rechazado por Jumio.\", rawData?: unknown) {\n super(message, { code: \"VALIDATION_FAILED\", rawData });\n this.name = \"JumioValidationError\";\n }\n}\n\n/**\n * Error lanzado cuando ocurre un fallo al obtener, descargar o procesar una imagen (frente o reverso).\n */\nexport class JumioImageProcessingError extends JumioError {\n constructor(message: string, cause?: unknown) {\n super(message, { code: \"IMAGE_PROCESSING_ERROR\", cause });\n this.name = \"JumioImageProcessingError\";\n }\n}\n\n/**\n * Error lanzado cuando el sondeo (polling) agota los intentos máximos sin un estado definitivo.\n */\nexport class JumioPollingTimeoutError extends JumioError {\n public readonly attempts: number;\n\n constructor(attempts: number, message = \"La validación sigue en proceso. Por favor verifica nuevamente más tarde.\", rawData?: unknown) {\n super(message, { code: \"POLLING_TIMEOUT\", rawData });\n this.name = \"JumioPollingTimeoutError\";\n this.attempts = attempts;\n }\n}\n\n/**\n * Error lanzado cuando la operación es cancelada explícitamente mediante un AbortSignal.\n */\nexport class JumioAbortError extends JumioError {\n constructor(message = \"La operación de validación de Jumio fue cancelada.\") {\n super(message, { code: \"ABORTED\" });\n this.name = \"JumioAbortError\";\n }\n}\n\n/**\n * Verifica si un error dado es una instancia de JumioError.\n */\nexport function isJumioError(error: unknown): error is JumioError {\n return (\n error instanceof JumioError ||\n (typeof error === \"object\" &&\n error !== null &&\n \"isJumioError\" in error &&\n (error as JumioError).isJumioError === true)\n );\n}\n","import axios, { AxiosError, AxiosInstance } from \"axios\";\nimport {\n JumioAbortError,\n JumioError,\n JumioNetworkError,\n JumioTimeoutError,\n} from \"./errors\";\nimport { extractJumioMessage } from \"./envelope\";\nimport type { JumioClientConfig } from \"./types\";\n\nexport class JumioHttpClient {\n private readonly client: AxiosInstance;\n private readonly config: JumioClientConfig;\n\n constructor(config: JumioClientConfig = {}) {\n this.config = {\n baseUrl: \"https://front.dynamicore.io\",\n endpoint: \"/marketplace/apps/jumio\",\n requestTimeout: 180000,\n statusTimeout: 120000,\n maxRetries: 3,\n retryDelayMs: 800,\n pollingIntervalMs: 10000,\n maxPollingAttempts: 20,\n authTokenPrefix: \"\",\n ...config,\n };\n\n if (config.axiosInstance) {\n this.client = config.axiosInstance;\n } else {\n this.client = axios.create({\n baseURL: this.config.baseUrl,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(this.config.context ? { context: this.config.context } : {}),\n ...(this.config.customHeaders || {}),\n },\n });\n }\n }\n\n /**\n * Resuelve los headers dinámicos (token de auth y context).\n */\n private async resolveHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n ...(this.config.customHeaders || {}),\n };\n\n if (this.config.context) {\n headers[\"context\"] = this.config.context;\n }\n\n if (this.config.authToken) {\n let token: string | undefined | null;\n if (typeof this.config.authToken === \"function\") {\n token = await this.config.authToken();\n } else {\n token = this.config.authToken;\n }\n\n if (token) {\n const prefix = this.config.authTokenPrefix ? `${this.config.authTokenPrefix.trim()} ` : \"\";\n headers[\"Authorization\"] = `${prefix}${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Normaliza cualquier error de Axios a una excepción tipada JumioError.\n */\n private normalizeError(error: unknown): JumioError {\n if (error instanceof JumioError) {\n return error;\n }\n\n if (axios.isAxiosError(error)) {\n const axiosErr = error as AxiosError;\n const status = axiosErr.response?.status;\n const responseData = axiosErr.response?.data;\n const serverMessage = extractJumioMessage(responseData) || extractJumioMessage(axiosErr);\n\n if (axiosErr.code === \"ECONNABORTED\" || axiosErr.code === \"ETIMEDOUT\") {\n return new JumioTimeoutError(\n serverMessage || \"La solicitud al servicio de Jumio excedió el tiempo límite.\",\n responseData\n );\n }\n\n if (!axiosErr.response) {\n return new JumioNetworkError(\n serverMessage || \"No fue posible comunicarse con el servicio de Jumio.\",\n axiosErr\n );\n }\n\n return new JumioError(serverMessage || `Error en la solicitud HTTP (${status}).`, {\n statusCode: status,\n rawData: responseData,\n code: axiosErr.code,\n cause: axiosErr,\n });\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return new JumioAbortError();\n }\n return new JumioError(error.message, { cause: error });\n }\n\n return new JumioError(\"Ocurrió un error inesperado al contactar a Jumio.\");\n }\n\n /**\n * Ejecuta una petición POST al endpoint de Jumio para iniciar o procesar la verificación.\n */\n public async postVerification<T>(\n payload: unknown,\n options?: { signal?: AbortSignal; timeout?: number }\n ): Promise<T> {\n if (options?.signal?.aborted) {\n throw new JumioAbortError();\n }\n\n try {\n const dynamicHeaders = await this.resolveHeaders();\n const endpoint = this.config.endpoint || \"/marketplace/apps/jumio\";\n const timeout = options?.timeout ?? this.config.requestTimeout ?? 180000;\n\n const response = await this.client.post<T>(endpoint, payload, {\n headers: dynamicHeaders,\n timeout,\n signal: options?.signal,\n });\n\n return response.data;\n } catch (err) {\n throw this.normalizeError(err);\n }\n }\n\n /**\n * Ejecuta una petición GET para consultar el estado actual de una verificación de INE.\n */\n public async getVerificationStatus<T>(\n accountId: string,\n workflowId: string,\n options?: { signal?: AbortSignal; timeout?: number }\n ): Promise<T> {\n if (options?.signal?.aborted) {\n throw new JumioAbortError();\n }\n\n try {\n const dynamicHeaders = await this.resolveHeaders();\n const endpoint = this.config.endpoint || \"/marketplace/apps/jumio\";\n const timeout = options?.timeout ?? this.config.statusTimeout ?? 120000;\n\n const response = await this.client.get<T>(endpoint, {\n params: {\n type: \"ine\",\n accountId,\n workflowId,\n },\n headers: dynamicHeaders,\n timeout,\n signal: options?.signal,\n });\n\n return response.data;\n } catch (err) {\n throw this.normalizeError(err);\n }\n }\n\n public getConfig(): Readonly<JumioClientConfig> {\n return this.config;\n }\n}\n","import { JumioAbortError, JumioImageProcessingError } from \"./errors\";\nimport type { ImageSource, S3SignerFunction } from \"./types\";\n\n/**\n * Elimina el prefijo data URI (ej. \"data:image/jpeg;base64,\") si existe.\n */\nexport function stripDataUrlPrefix(dataUrl: string): string {\n if (!dataUrl) return \"\";\n const commaIndex = dataUrl.indexOf(\",\");\n return commaIndex >= 0 ? dataUrl.slice(commaIndex + 1).trim() : dataUrl.trim();\n}\n\n/**\n * Verifica si una cadena parece ser Base64 directo o Data URL.\n */\nexport function isBase64String(input: string): boolean {\n const trimmed = input.trim();\n if (trimmed.startsWith(\"data:\")) return true;\n // Si no parece una URL http/https/blob y tiene caracteres válidos de base64\n if (!trimmed.startsWith(\"http://\") && !trimmed.startsWith(\"https://\") && !trimmed.startsWith(\"blob:\") && !trimmed.startsWith(\"/\")) {\n return /^[A-Za-z0-9+/=_\\-\\r\\n]+$/.test(trimmed);\n }\n return false;\n}\n\n/**\n * Extrae la URL utilizable a partir de un objeto candidato devuelto por endpoints de S3 u objetos de formulario.\n */\nexport function normalizeSignedUrl(input: unknown, fallback = \"\"): string {\n if (typeof input === \"string\" && input.trim()) {\n return input.trim();\n }\n\n if (input && typeof input === \"object\") {\n const record = input as Record<string, unknown>;\n if (\"url\" in record && typeof record.url === \"string\" && record.url.trim()) {\n return record.url.trim();\n }\n if (\"Location\" in record && typeof record.Location === \"string\" && record.Location.trim()) {\n return record.Location.trim();\n }\n if (\"signedUrl\" in record && typeof record.signedUrl === \"string\" && record.signedUrl.trim()) {\n return record.signedUrl.trim();\n }\n }\n\n return fallback;\n}\n\n/**\n * Convierte un Blob o File en una cadena Base64 pura.\n */\nexport function blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n // Si estamos en entorno Node sin FileReader pero con Blob nativo\n if (typeof FileReader === \"undefined\") {\n blob\n .arrayBuffer()\n .then((buffer) => {\n resolve(arrayBufferToBase64(buffer));\n })\n .catch((err) =>\n reject(new JumioImageProcessingError(\"No se pudo leer el archivo binario.\", err))\n );\n return;\n }\n\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = String(reader.result ?? \"\");\n resolve(stripDataUrlPrefix(dataUrl));\n };\n reader.onerror = () =>\n reject(new JumioImageProcessingError(\"No se pudo convertir la imagen a base64.\", reader.error));\n reader.readAsDataURL(blob);\n });\n}\n\n/**\n * Convierte un ArrayBuffer o Uint8Array a cadena Base64 pura.\n */\nexport function arrayBufferToBase64(buffer: ArrayBuffer | Uint8Array): string {\n if (typeof Buffer !== \"undefined\") {\n // Entorno Node.js\n const nodeBuf =\n buffer instanceof Uint8Array\n ? Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n : Buffer.from(buffer);\n return nodeBuf.toString(\"base64\");\n }\n\n // Entorno Browser\n let binary = \"\";\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n const len = bytes.byteLength;\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Descarga una imagen desde una URL HTTP/HTTPS/Blob y la retorna como Base64 puro.\n */\nexport async function fetchUrlAsBase64(\n url: string,\n signal?: AbortSignal\n): Promise<string> {\n if (signal?.aborted) {\n throw new JumioAbortError();\n }\n\n const trimmed = url.trim();\n if (trimmed.startsWith(\"data:\")) {\n return stripDataUrlPrefix(trimmed);\n }\n\n try {\n const response = await fetch(trimmed, { signal });\n if (!response.ok) {\n throw new JumioImageProcessingError(\n `No se pudo descargar la imagen desde la URL remota (HTTP ${response.status}).`\n );\n }\n\n const blob = await response.blob();\n return await blobToBase64(blob);\n } catch (error) {\n if (signal?.aborted || (error instanceof Error && error.name === \"AbortError\")) {\n throw new JumioAbortError();\n }\n if (error instanceof JumioImageProcessingError) {\n throw error;\n }\n throw new JumioImageProcessingError(\n `Error al descargar o procesar la imagen desde la URL: ${url}`,\n error\n );\n }\n}\n\n/**\n * Resuelve cualquier tipo de entrada de imagen (URL, ruta S3, File, Blob, Base64) a una cadena Base64 pura.\n */\nexport async function resolveImageSourceToBase64(\n source: ImageSource,\n s3Signer?: S3SignerFunction,\n signal?: AbortSignal\n): Promise<string> {\n if (signal?.aborted) {\n throw new JumioAbortError();\n }\n\n if (!source) {\n throw new JumioImageProcessingError(\"No se proporcionó una imagen válida para la verificación.\");\n }\n\n // 1. Si es Blob o File\n if (typeof Blob !== \"undefined\" && source instanceof Blob) {\n return blobToBase64(source);\n }\n\n // 2. Si es ArrayBuffer o Uint8Array\n if (source instanceof ArrayBuffer || source instanceof Uint8Array) {\n return arrayBufferToBase64(source);\n }\n\n // 3. Si es un objeto contenedor (ej. { url: \"...\" } o devuelto por S3)\n if (typeof source === \"object\" && source !== null) {\n const extractedUrl = normalizeSignedUrl(source, \"\");\n if (extractedUrl) {\n return resolveImageSourceToBase64(extractedUrl, s3Signer, signal);\n }\n }\n\n // 4. Si es una cadena\n if (typeof source === \"string\") {\n const text = source.trim();\n\n if (!text) {\n throw new JumioImageProcessingError(\"La ruta o contenido de la imagen está vacío.\");\n }\n\n // 4.1 Data URL\n if (text.startsWith(\"data:\")) {\n return stripDataUrlPrefix(text);\n }\n\n // 4.2 URL HTTP / HTTPS / Blob\n if (text.startsWith(\"http://\") || text.startsWith(\"https://\") || text.startsWith(\"blob:\")) {\n // Si tenemos s3Signer y parece una URL que necesita firma\n if (s3Signer && (text.includes(\".amazonaws.com\") || text.includes(\"/s3/\"))) {\n try {\n const signed = await s3Signer(text, 300);\n const signedUrl = normalizeSignedUrl(signed, text);\n return await fetchUrlAsBase64(signedUrl, signal);\n } catch {\n // Si falla firmar, intentar descargar directo\n return await fetchUrlAsBase64(text, signal);\n }\n }\n return await fetchUrlAsBase64(text, signal);\n }\n\n // 4.3 Ruta relativa de S3 / Storage (ej. \"company/123/ine_front.jpg\")\n if (s3Signer && (text.startsWith(\"company/\") || text.startsWith(\"/\") || text.includes(\"/\"))) {\n try {\n const signed = await s3Signer(text, 300);\n const signedUrl = normalizeSignedUrl(signed, \"\");\n if (signedUrl) {\n return await fetchUrlAsBase64(signedUrl, signal);\n }\n } catch (err) {\n throw new JumioImageProcessingError(\n `No se pudo firmar la ruta de almacenamiento S3: ${text}`,\n err\n );\n }\n }\n\n // 4.4 Base64 directo\n if (isBase64String(text)) {\n return stripDataUrlPrefix(text);\n }\n\n throw new JumioImageProcessingError(\n `Formato de imagen no reconocido o ruta inválida: ${text.slice(0, 50)}...`\n );\n }\n\n throw new JumioImageProcessingError(\"Tipo de dato de imagen no soportado.\");\n}\n","import { extractJumioMessage, toLowerText } from \"./envelope\";\nimport { JumioAbortError } from \"./errors\";\n\nexport interface RetryOptions {\n maxRetries?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n factor?: number;\n shouldRetry?: (error: unknown) => boolean;\n signal?: AbortSignal;\n onRetry?: (attempt: number, error: unknown, delayMs: number) => void;\n}\n\n/**\n * Espera una cantidad dada de milisegundos con soporte para cancelación vía AbortSignal.\n */\nexport function delay(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n return reject(new JumioAbortError());\n }\n\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abortHandler);\n resolve();\n }, ms);\n\n const abortHandler = () => {\n clearTimeout(timer);\n reject(new JumioAbortError());\n };\n\n signal?.addEventListener(\"abort\", abortHandler, { once: true });\n });\n}\n\n/**\n * Evalúa si un mensaje o error es atribuible a fallos transitorios o timeouts de Jumio que ameritan reintento.\n */\nexport function shouldRetryJumio(errorOrMessage: unknown): boolean {\n if (!errorOrMessage) return false;\n\n const text = toLowerText(\n typeof errorOrMessage === \"string\"\n ? errorOrMessage\n : extractJumioMessage(errorOrMessage)\n );\n\n const errorObj = errorOrMessage as {\n code?: string;\n status?: number;\n response?: { status?: number };\n };\n\n const status = errorObj?.status || errorObj?.response?.status;\n const code = String(errorObj?.code || \"\").toUpperCase();\n\n // Códigos HTTP reintentables (502, 503, 504, 408)\n if (status === 408 || status === 502 || status === 503 || status === 504) {\n return true;\n }\n\n // Códigos de red de Axios / Node\n if (\n code === \"ECONNABORTED\" ||\n code === \"ETIMEDOUT\" ||\n code === \"ECONNRESET\" ||\n code === \"EAI_AGAIN\"\n ) {\n return true;\n }\n\n return (\n text.includes(\"timed out\") ||\n text.includes(\"timeout\") ||\n text.includes(\"temporarily unavailable\") ||\n text.includes(\"network error\") ||\n text.includes(\"socket hang up\") ||\n text.includes(\"gateway timeout\") ||\n text.includes(\"service unavailable\") ||\n text.includes(\"excedió el tiempo de espera\")\n );\n}\n\n/**\n * Ejecuta una operación asíncrona con reintentos automáticos y backoff exponencial.\n */\nexport async function withRetry<T>(\n operation: (attempt: number) => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const {\n maxRetries = 3,\n initialDelayMs = 800,\n maxDelayMs = 10000,\n factor = 1.5,\n shouldRetry = shouldRetryJumio,\n signal,\n onRetry,\n } = options;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxRetries; attempt += 1) {\n if (signal?.aborted) {\n throw new JumioAbortError();\n }\n\n try {\n return await operation(attempt);\n } catch (error) {\n lastError = error;\n\n if (signal?.aborted) {\n throw new JumioAbortError();\n }\n\n const isLastAttempt = attempt >= maxRetries;\n const isRetryable = shouldRetry(error);\n\n if (isLastAttempt || !isRetryable) {\n throw error;\n }\n\n const currentDelay = Math.min(\n Math.round(initialDelayMs * Math.pow(factor, attempt - 1)),\n maxDelayMs\n );\n\n onRetry?.(attempt, error, currentDelay);\n await delay(currentDelay, signal);\n }\n }\n\n throw lastError;\n}\n","import {\n extractEnvelopeData,\n extractJumioMessage,\n extractNestedData,\n isFinalJumioStatus,\n isPassedJumioDecision,\n resolveVerificationValidity,\n} from \"./envelope\";\nimport {\n JumioAbortError,\n JumioPollingTimeoutError,\n} from \"./errors\";\nimport type { JumioHttpClient } from \"./http\";\nimport { delay, withRetry } from \"./retry\";\nimport type { JumioVerificationData, PollStatusOptions, VerifyIneResult } from \"./types\";\n\n/**\n * Sondea activamente el estado de verificación de un workflow de Jumio hasta alcanzar un estado definitivo.\n */\nexport async function pollJumioStatus(\n http: JumioHttpClient,\n accountId: string,\n workflowId: string,\n options: PollStatusOptions = {}\n): Promise<VerifyIneResult> {\n const config = http.getConfig();\n const maxAttempts = options.maxAttempts ?? config.maxPollingAttempts ?? 20;\n const intervalMs = options.pollingIntervalMs ?? config.pollingIntervalMs ?? 10000;\n const signal = options.signal;\n\n let lastData: JumioVerificationData = {};\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n if (signal?.aborted) {\n throw new JumioAbortError();\n }\n\n // Consulta de estado protegida con reintentos para fallas transitorias de red\n const responseData = await withRetry(\n () =>\n http.getVerificationStatus<unknown>(accountId, workflowId, {\n signal,\n timeout: config.statusTimeout,\n }),\n {\n maxRetries: config.maxRetries ?? 3,\n initialDelayMs: config.retryDelayMs ?? 800,\n signal,\n }\n );\n\n const firstLevel = extractEnvelopeData<unknown>(responseData);\n const statusData = (extractNestedData(firstLevel) as JumioVerificationData) ?? {};\n lastData = statusData;\n\n options.onAttempt?.(attempt, maxAttempts, statusData);\n\n // 1. Si la respuesta trae explícitamente valid: true\n if (statusData.valid === true) {\n return {\n valid: true,\n status: (statusData.workflowStatus || statusData.status || \"APPROVED_VERIFIED\") as string,\n accountId,\n workflowId,\n data: statusData,\n };\n }\n\n const workflowStatus =\n statusData.workflowStatus ?? statusData.status ?? statusData.decision;\n\n // 2. Si el estado es final (o la decisión ya es un veredicto de aprobado)\n if (\n isFinalJumioStatus(workflowStatus) ||\n (statusData.decision && isPassedJumioDecision(statusData.decision))\n ) {\n // El veredicto se resuelve priorizando los campos explícitos `valid` y\n // `decision` sobre `workflowStatus` (p. ej. `PROCESSED` + `NOT_EXECUTED`\n // es un rechazo, no una aprobación).\n const isValid = resolveVerificationValidity(statusData, workflowStatus);\n const errorMessage = isValid\n ? undefined\n : extractJumioMessage(statusData) || \"El documento fue rechazado durante la validación.\";\n\n return {\n valid: isValid,\n status: String(workflowStatus),\n accountId,\n workflowId,\n data: statusData,\n errorMessage,\n };\n }\n\n // Si aún no es el último intento, esperar el intervalo\n if (attempt < maxAttempts) {\n await delay(intervalMs, signal);\n }\n }\n\n // Si se agotaron los intentos sin resolución final\n const lastMessage =\n extractJumioMessage(lastData) ||\n \"La validación de INE sigue en proceso. Intenta nuevamente en unos momentos.\";\n\n throw new JumioPollingTimeoutError(maxAttempts, lastMessage, lastData);\n}\n","import {\n extractEnvelopeData,\n extractJumioMessage,\n extractNestedData,\n isFinalJumioStatus,\n} from \"./envelope\";\nimport {\n JumioAbortError,\n JumioError,\n JumioValidationError,\n} from \"./errors\";\nimport { JumioHttpClient } from \"./http\";\nimport { resolveImageSourceToBase64 } from \"./image\";\nimport { pollJumioStatus } from \"./polling\";\nimport { withRetry } from \"./retry\";\nimport type {\n ImageSource,\n JumioClientConfig,\n JumioIneStartData,\n JumioProgressCallback,\n JumioVerificationData,\n JumioVerificationPayload,\n PollStatusOptions,\n VerifyIneInput,\n VerifyIneResult,\n} from \"./types\";\n\n/**\n * Cliente principal para gestionar validaciones de identidad mediante Jumio.\n */\nexport class JumioClient {\n private readonly http: JumioHttpClient;\n private readonly config: JumioClientConfig;\n\n constructor(config: JumioClientConfig = {}) {\n this.config = config;\n this.http = new JumioHttpClient(config);\n }\n\n /**\n * Inicia el proceso de verificación convirtiendo las imágenes y enviando el payload inicial a Jumio.\n */\n public async startIneVerification(params: {\n clientId: string;\n frontImage: ImageSource;\n backImage: ImageSource;\n signal?: AbortSignal;\n onProgress?: JumioProgressCallback;\n }): Promise<JumioIneStartData> {\n const { clientId, frontImage, backImage, signal, onProgress } = params;\n\n if (!clientId || !clientId.trim()) {\n throw new JumioValidationError(\"Se requiere un identificador de cliente válido (clientId).\");\n }\n\n if (signal?.aborted) {\n throw new JumioAbortError();\n }\n\n onProgress?.(\"RESOLVING_IMAGES\", 10);\n\n // 1. Convertir ambas imágenes a Base64 puro\n const [frontBase64, backBase64] = await Promise.all([\n resolveImageSourceToBase64(frontImage, this.config.s3Signer, signal),\n resolveImageSourceToBase64(backImage, this.config.s3Signer, signal),\n ]);\n\n if (signal?.aborted) {\n throw new JumioAbortError();\n }\n\n onProgress?.(\"SENDING_PAYLOAD\", 40);\n\n const payload: JumioVerificationPayload = {\n client: clientId.trim(),\n front_image_b64: frontBase64,\n back_image_b64: backBase64,\n };\n\n // 2. Enviar a Jumio con reintentos para caídas o timeouts\n const response = await withRetry(\n () =>\n this.http.postVerification<unknown>(payload, {\n signal,\n timeout: this.config.requestTimeout,\n }),\n {\n maxRetries: this.config.maxRetries ?? 3,\n initialDelayMs: this.config.retryDelayMs ?? 800,\n signal,\n }\n );\n\n onProgress?.(\"PAYLOAD_SENT\", 60);\n\n // 3. Desempaquetar respuesta\n const firstLevel = extractEnvelopeData<unknown>(response);\n const startData = (extractNestedData(firstLevel) as JumioIneStartData) ?? {};\n\n return startData;\n }\n\n /**\n * Consulta una única vez el estado actual de la validación.\n */\n public async getIneStatus(\n accountId: string,\n workflowId: string,\n signal?: AbortSignal\n ): Promise<JumioVerificationData> {\n const response = await this.http.getVerificationStatus<unknown>(\n accountId,\n workflowId,\n { signal, timeout: this.config.statusTimeout }\n );\n const firstLevel = extractEnvelopeData<unknown>(response);\n return (extractNestedData(firstLevel) as JumioVerificationData) ?? {};\n }\n\n /**\n * Sondea periódicamente el estado hasta obtener un resultado definitivo.\n */\n public async pollIneStatus(\n accountId: string,\n workflowId: string,\n options?: PollStatusOptions\n ): Promise<VerifyIneResult> {\n return pollJumioStatus(this.http, accountId, workflowId, options);\n }\n\n /**\n * Ejecuta el flujo completo de validación de INE.\n *\n * @param input Parámetros de validación y callbacks.\n * @returns `VerifyIneResult` con el resultado inicial o definitivo según `awaitFinalStatus`.\n */\n public async verifyIne(input: VerifyIneInput): Promise<VerifyIneResult> {\n const {\n clientId,\n frontImage,\n backImage,\n awaitFinalStatus = false,\n onStatusResolved,\n onStatusError,\n onProgress,\n signal,\n } = input;\n\n // 1. Iniciar verificación y obtener datos iniciales\n const startData = await this.startIneVerification({\n clientId,\n frontImage,\n backImage,\n signal,\n onProgress,\n });\n\n // 2. Si la respuesta inicial ya trae un veredicto definitivo:\n // - `valid: true` explícito, o\n // - `valid: false` con workflow ya final (rechazo síncrono de la gateway).\n // En ambos casos se resuelve de inmediato sin requerir IDs de seguimiento.\n const startStatus =\n startData?.workflowStatus ?? startData?.status ?? startData?.decision;\n const isStartFinal = isFinalJumioStatus(startStatus);\n\n if (startData?.valid === true || (startData?.valid === false && isStartFinal)) {\n const isValid = startData?.valid === true;\n const immediateResult: VerifyIneResult = {\n valid: isValid,\n status: (startStatus || (isValid ? \"APPROVED_VERIFIED\" : \"REJECTED\")) as string,\n accountId: startData?.accountId,\n workflowId: startData?.workflowId,\n data: startData,\n ...(isValid\n ? {}\n : {\n errorMessage:\n extractJumioMessage(startData) ||\n \"El documento fue rechazado durante la validación.\",\n }),\n };\n\n onProgress?.(\"COMPLETED\", 100);\n onStatusResolved?.(immediateResult);\n return immediateResult;\n }\n\n const accountId = String(startData?.accountId ?? \"\").trim();\n const workflowId = String(startData?.workflowId ?? \"\").trim();\n\n if (!accountId || !workflowId) {\n const errorMessage =\n extractJumioMessage(startData) ||\n \"No fue posible obtener los identificadores de seguimiento de la validación.\";\n const error = new JumioError(errorMessage, { rawData: startData });\n onStatusError?.(error);\n throw error;\n }\n\n // 3. Flujo NO bloqueante (en segundo plano):\n if (!awaitFinalStatus) {\n onProgress?.(\"POLLING_BACKGROUND\", 70);\n\n // Lanzar sondeo en segundo plano desacoplado del señal del llamador:\n // al retornar de inmediato, la validación debe continuar aunque el\n // componente se desmonte (navegación, cierre de pantalla) o se aborte\n // el signal original. El signal solo aplica a la fase síncrona inicial.\n this.pollIneStatus(accountId, workflowId)\n .then((finalResult) => {\n onProgress?.(\"COMPLETED\", 100);\n onStatusResolved?.(finalResult);\n })\n .catch((err) => {\n const normalizedError =\n err instanceof Error ? err : new Error(\"No se pudo consultar el estatus de validación.\");\n onStatusError?.(normalizedError);\n });\n\n // Retorna éxito inicial para continuar la experiencia de usuario\n return {\n valid: true,\n status: (startData.status || startData.workflowStatus || \"INITIATED\") as string,\n accountId,\n workflowId,\n data: startData,\n };\n }\n\n // 4. Flujo bloqueante (espera sondeo hasta resultado final):\n onProgress?.(\"POLLING_FOREGROUND\", 70);\n\n const finalResult = await this.pollIneStatus(accountId, workflowId, { signal });\n onProgress?.(\"COMPLETED\", 100);\n onStatusResolved?.(finalResult);\n\n return finalResult;\n }\n}\n\n/**\n * Fábrica para crear una nueva instancia de `JumioClient`.\n */\nexport function createJumioClient(config?: JumioClientConfig): JumioClient {\n return new JumioClient(config);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { JumioClient } from \"../core/client\";\nimport { JumioAbortError } from \"../core/errors\";\nimport type {\n VerifyIneInput,\n VerifyIneResult,\n} from \"../core/types\";\nimport type {\n UseJumioVerificationOptions,\n UseJumioVerificationReturn,\n UseJumioVerificationState,\n} from \"./types\";\n\nconst INITIAL_STATE: UseJumioVerificationState = {\n isSubmitting: false,\n isPolling: false,\n isLoading: false,\n stage: \"IDLE\",\n progress: 0,\n result: null,\n error: null,\n isSuccess: false,\n isError: false,\n};\n\n/**\n * Hook de React para integrar validación de documentos e INE con Jumio.\n *\n * @example\n * ```tsx\n * const { verify, isSubmitting, isPolling, result, error } = useJumioVerification({\n * baseUrl: process.env.NEXT_PUBLIC_API_URL,\n * context: process.env.NEXT_PUBLIC_DYNAMICORE_MORAL_CONTEXT,\n * onStatusResolved: (res) => {\n * if (res.valid) console.log(\"INE válida\");\n * }\n * });\n * ```\n */\nexport function useJumioVerification(\n options: UseJumioVerificationOptions = {}\n): UseJumioVerificationReturn {\n const {\n client: customClient,\n baseUrl,\n endpoint,\n context,\n authToken,\n authTokenPrefix,\n requestTimeout,\n statusTimeout,\n maxRetries,\n retryDelayMs,\n pollingIntervalMs,\n maxPollingAttempts,\n s3Signer,\n customHeaders,\n axiosInstance,\n onStatusResolved: globalOnStatusResolved,\n onStatusError: globalOnStatusError,\n onProgress: globalOnProgress,\n } = options;\n\n // Instancia única o pasada por prop\n const client = useMemo(() => {\n if (customClient) return customClient;\n return new JumioClient({\n baseUrl,\n endpoint,\n context,\n authToken,\n authTokenPrefix,\n requestTimeout,\n statusTimeout,\n maxRetries,\n retryDelayMs,\n pollingIntervalMs,\n maxPollingAttempts,\n s3Signer,\n customHeaders,\n axiosInstance,\n });\n }, [\n customClient,\n baseUrl,\n endpoint,\n context,\n authToken,\n authTokenPrefix,\n requestTimeout,\n statusTimeout,\n maxRetries,\n retryDelayMs,\n pollingIntervalMs,\n maxPollingAttempts,\n s3Signer,\n customHeaders,\n axiosInstance,\n ]);\n\n const [state, setState] = useState<UseJumioVerificationState>(INITIAL_STATE);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Mantener referencias actualizadas de los callbacks para evitar cierres obsoletos\n const callbacksRef = useRef({\n onStatusResolved: globalOnStatusResolved,\n onStatusError: globalOnStatusError,\n onProgress: globalOnProgress,\n });\n\n useEffect(() => {\n callbacksRef.current = {\n onStatusResolved: globalOnStatusResolved,\n onStatusError: globalOnStatusError,\n onProgress: globalOnProgress,\n };\n }, [globalOnStatusResolved, globalOnStatusError, globalOnProgress]);\n\n // Cancelar al desmontar el componente si hay una operación activa\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setState((prev) => ({\n ...prev,\n isSubmitting: false,\n isPolling: false,\n isLoading: false,\n stage: \"CANCELLED\",\n }));\n }, []);\n\n const reset = useCallback(() => {\n cancel();\n setState(INITIAL_STATE);\n }, [cancel]);\n\n const verify = useCallback(\n async (\n input: Omit<VerifyIneInput, \"onStatusResolved\" | \"onStatusError\"> & {\n onStatusResolved?: (res: VerifyIneResult) => void;\n onStatusError?: (err: Error) => void;\n }\n ): Promise<VerifyIneResult> => {\n // Si había una petición previa, abortarla\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n setState({\n isSubmitting: true,\n isPolling: false,\n isLoading: true,\n stage: \"STARTING\",\n progress: 5,\n result: null,\n error: null,\n isSuccess: false,\n isError: false,\n });\n\n const handleProgress = (stage: string, percent?: number) => {\n setState((prev) => ({\n ...prev,\n stage,\n progress: percent ?? prev.progress,\n isPolling: stage.includes(\"POLLING\"),\n }));\n input.onProgress?.(stage, percent);\n callbacksRef.current.onProgress?.(stage, percent);\n };\n\n const handleResolved = (res: VerifyIneResult) => {\n setState((prev) => ({\n ...prev,\n isSubmitting: false,\n isPolling: false,\n isLoading: false,\n stage: \"COMPLETED\",\n progress: 100,\n result: res,\n isSuccess: res.valid,\n isError: !res.valid,\n error: res.valid\n ? null\n : new Error(res.errorMessage || \"Validación de documento fallida\"),\n }));\n\n input.onStatusResolved?.(res);\n callbacksRef.current.onStatusResolved?.(res);\n };\n\n const handleError = (err: Error) => {\n if (err instanceof JumioAbortError) {\n return;\n }\n\n setState((prev) => ({\n ...prev,\n isSubmitting: false,\n isPolling: false,\n isLoading: false,\n stage: \"ERROR\",\n error: err,\n isError: true,\n isSuccess: false,\n }));\n\n input.onStatusError?.(err);\n callbacksRef.current.onStatusError?.(err);\n };\n\n try {\n const awaitFinal = input.awaitFinalStatus ?? false;\n\n const initialResult = await client.verifyIne({\n ...input,\n awaitFinalStatus: awaitFinal,\n signal: controller.signal,\n onProgress: handleProgress,\n onStatusResolved: (res: VerifyIneResult) => {\n handleResolved(res);\n },\n onStatusError: (err: Error) => {\n handleError(err);\n },\n });\n\n // Si es asíncrono en 2do plano, marcamos que terminó la fase de subida y sigue el polling\n if (!awaitFinal && initialResult.valid && !initialResult.data) {\n setState((prev) => ({\n ...prev,\n isSubmitting: false,\n isPolling: true,\n stage: \"POLLING_BACKGROUND\",\n result: initialResult,\n }));\n } else if (!awaitFinal && initialResult.valid) {\n setState((prev) => ({\n ...prev,\n isSubmitting: false,\n isPolling: true,\n stage: \"POLLING_BACKGROUND\",\n result: initialResult,\n }));\n }\n\n return initialResult;\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n handleError(normalizedError);\n throw normalizedError;\n }\n },\n [client]\n );\n\n return {\n ...state,\n verify,\n cancel,\n reset,\n client,\n };\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "@dynamicore/jumio-sdk",
3
+ "version": "1.0.0",
4
+ "description": "Librería modular y tipada para la validación de identidad e INE con Jumio en aplicaciones DynamiCore.",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "sideEffects": false,
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.js"
14
+ },
15
+ "./core": {
16
+ "types": "./dist/core/index.d.ts",
17
+ "import": "./dist/core/index.mjs",
18
+ "require": "./dist/core/index.js"
19
+ },
20
+ "./react": {
21
+ "types": "./dist/react/index.d.ts",
22
+ "import": "./dist/react/index.mjs",
23
+ "require": "./dist/react/index.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "README.md",
29
+ "LICENSE"
30
+ ],
31
+ "engines": {
32
+ "node": ">=18"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/fintcore/jumio-sdk.git"
37
+ },
38
+ "bugs": {
39
+ "url": "https://github.com/fintcore/jumio-sdk/issues"
40
+ },
41
+ "homepage": "https://github.com/fintcore/jumio-sdk#readme",
42
+ "scripts": {
43
+ "build": "tsup",
44
+ "prepublishOnly": "npm run build",
45
+ "dev": "tsup --watch",
46
+ "test": "vitest run",
47
+ "test:watch": "vitest",
48
+ "test:coverage": "vitest run --coverage",
49
+ "typecheck": "tsc --noEmit"
50
+ },
51
+ "keywords": [
52
+ "jumio",
53
+ "ine",
54
+ "kyc",
55
+ "verification",
56
+ "dynamicore",
57
+ "identity",
58
+ "react",
59
+ "sdk"
60
+ ],
61
+ "author": "DynamiCore",
62
+ "license": "MIT",
63
+ "dependencies": {
64
+ "axios": "^1.7.9"
65
+ },
66
+ "peerDependencies": {
67
+ "react": ">=18.0.0"
68
+ },
69
+ "peerDependenciesMeta": {
70
+ "react": {
71
+ "optional": true
72
+ }
73
+ },
74
+ "devDependencies": {
75
+ "@testing-library/react": "^16.2.0",
76
+ "@types/node": "^22.13.4",
77
+ "@types/react": "^19.0.10",
78
+ "@types/react-dom": "^19.0.4",
79
+ "jsdom": "^26.0.0",
80
+ "react": "^19.0.0",
81
+ "react-dom": "^19.0.0",
82
+ "tsup": "^8.3.6",
83
+ "typescript": "^5.7.3",
84
+ "vitest": "^3.0.5"
85
+ }
86
+ }