@dynamicore/jumio-sdk 1.0.0 → 1.0.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/errors.ts","../../src/core/envelope.ts","../../src/core/retry.ts","../../src/core/image.ts","../../src/core/http.ts","../../src/core/polling.ts","../../src/core/client.ts"],"names":["axios","finalResult"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 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","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 { 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 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 {\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"]}
1
+ {"version":3,"sources":["../../src/core/errors.ts","../../src/core/envelope.ts","../../src/core/retry.ts","../../src/core/webflow.ts","../../src/core/index.ts","../../src/core/image.ts","../../src/core/http.ts","../../src/core/polling.ts","../../src/core/client.ts"],"names":["JumioError","JumioTimeoutError","JumioNetworkError","JumioValidationError","JumioImageProcessingError","JumioPollingTimeoutError","JumioAbortError","FINAL_JUMIO_STATUSES","APPROVED_JUMIO_STATUSES","axios","finalResult","resolveWebflowResult"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 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: ... }` o `{ values: ... }` si están presentes en la respuesta.\n * Soporta ambas formas de envelope usadas por los distintos endpoints de DynamiCore/Jumio.\n */\nexport function extractEnvelopeData<T>(responseData: unknown): T {\n if (\n responseData &&\n typeof responseData === \"object\"\n ) {\n const obj = responseData as Record<string, unknown>;\n // Prioritize `data` envelope\n if (\"data\" in obj && obj.data !== undefined) {\n return obj.data as T;\n }\n // Fallback to `values` envelope (used by some Jumio/DynamiCore endpoints)\n if (\"values\" in obj && obj.values !== undefined) {\n return obj.values 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/**\n * Codifica una URL en Base64 URL-safe (sin `+`, `/` ni `=`).\n *\n * Compatible con:\n * - **Node.js ≥ 18**: Usa `Buffer.from(url).toString(\"base64\")`.\n * - **Navegadores modernos**: Usa `TextEncoder` + `btoa`.\n * - **Navegadores legacy**: Usa `btoa` directamente.\n *\n * @param url La URL a codificar.\n * @returns La cadena codificada en Base64 URL-safe, o `null` si ocurre un error.\n */\nexport function encodeUrlToBase64UrlSafe(url: string): string | null {\n try {\n let base64: string;\n\n // Node.js environment\n if (typeof Buffer !== \"undefined\") {\n base64 = Buffer.from(url, \"utf-8\").toString(\"base64\");\n } else if (typeof TextEncoder !== \"undefined\") {\n // Modern browser\n const encoder = new TextEncoder();\n const data = encoder.encode(url);\n base64 = btoa(String.fromCharCode(...new Uint8Array(data)));\n } else {\n // Legacy browser fallback\n base64 = btoa(url);\n }\n\n return base64\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n } catch {\n return null;\n }\n}\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 { encodeUrlToBase64UrlSafe, extractEnvelopeData, extractJumioMessage, extractNestedData } from \"./envelope\";\nimport { JumioAbortError, JumioError, JumioPollingTimeoutError, JumioValidationError } from \"./errors\";\nimport type { JumioHttpClient } from \"./http\";\nimport { delay, withRetry } from \"./retry\";\nimport type {\n GetWebflowStatusInput,\n JumioClientConfig,\n PollWebflowOptions,\n StartWebflowInput,\n StartWebflowResult,\n WebflowResult,\n WebflowReturnParams,\n} from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// URL Builder\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Construye la URL de redirección para el flujo Hosted Webflow.\n *\n * Si se provee un `proxyUrl`, la URL de retorno se codifica en Base64 URL-safe y\n * se adjunta al proxy. Esto es util cuando la gateway de Jumio o el backend requiere\n * un intermediario para manejar la redireccion.\n *\n * Si no se provee `proxyUrl`, la URL de retorno se usa directamente tal cual.\n *\n * @param returnUrl La URL de la aplicacion a la que Jumio redirigira al usuario.\n * @param proxyUrl URL base del proxy de redireccion (opcional).\n * @returns La URL final construida.\n */\nexport function buildRedirectUrl(returnUrl: string, proxyUrl?: string): string {\n if (!proxyUrl) {\n return returnUrl;\n }\n\n const encoded = encodeUrlToBase64UrlSafe(returnUrl);\n if (!encoded) {\n throw new JumioValidationError(\n `No fue posible codificar la URL de retorno: \"${returnUrl}\"`\n );\n }\n\n // Normalizar el proxy URL para evitar doble barra\n const normalizedProxy = proxyUrl.endsWith(\"/\") ? proxyUrl : `${proxyUrl}/`;\n return `${normalizedProxy}${encoded}`;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Return Params Parser\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Extrae los parametros de seguimiento de Jumio de la URL de retorno.\n *\n * Jumio redirige al usuario de vuelta a la aplicacion anadiendo `accountId` y\n * `workflowExecutionId` (o `workflowId`) como query params. Este helper los\n * extrae correctamente, manejando:\n *\n * - Parametros directos: `?accountId=...&workflowExecutionId=...`\n * - Parametros anidados dentro de `?status=...?workflowExecutionId=...`\n * - Alias `workflowId` ademas de `workflowExecutionId`\n *\n * @param source URL completa, `URLSearchParams`, o un objeto similar a `window.location`.\n * Si se omite, usa `window.location.search` (solo en navegador).\n * @returns `WebflowReturnParams` con los parametros extraidos.\n */\nexport function parseWebflowReturnParams(\n source?: string | URLSearchParams | { search?: string; href?: string }\n): WebflowReturnParams {\n let searchString: string;\n\n if (!source) {\n // Browser environment: use current window location\n if (typeof window !== \"undefined\" && window.location) {\n searchString = window.location.search;\n } else {\n return { allParams: {} };\n }\n } else if (typeof source === \"string\") {\n // Full URL string\n const questionIdx = source.indexOf(\"?\");\n searchString = questionIdx >= 0 ? source.slice(questionIdx) : \"\";\n } else if (source instanceof URLSearchParams) {\n searchString = `?${source.toString()}`;\n } else {\n // Object with search or href property\n const hrefSearch =\n source.href\n ? (() => {\n try { return new URL(source.href).search; } catch { return \"\"; }\n })()\n : \"\";\n searchString = source.search ?? hrefSearch;\n }\n\n const params = new URLSearchParams(searchString);\n\n // Collect all params into a plain record\n const allParams: Record<string, string> = {};\n params.forEach((value, key) => {\n allParams[key] = value;\n });\n\n // Extract accountId\n const accountId = params.get(\"accountId\") ?? undefined;\n\n // Extract workflowId -- supports both `workflowExecutionId` and `workflowId`\n let workflowId =\n params.get(\"workflowExecutionId\") ??\n params.get(\"workflowId\") ??\n undefined;\n\n // Extract raw status (may contain nested params)\n const rawStatus = params.get(\"status\") ?? undefined;\n\n // Handle nested params inside the `status` value:\n // e.g. status=?accountId=abc&workflowExecutionId=xyz (observed in some DynamiCore configs)\n if (rawStatus && (!accountId || !workflowId)) {\n const statusParts = rawStatus.split(\"?\");\n const nestedSearch = statusParts.length > 1 ? `?${statusParts.slice(1).join(\"?\")}` : \"\";\n if (nestedSearch && nestedSearch !== \"?\") {\n const nestedParams = new URLSearchParams(nestedSearch);\n nestedParams.forEach((value, key) => {\n if (!allParams[key]) allParams[key] = value;\n });\n\n if (!workflowId) {\n workflowId =\n nestedParams.get(\"workflowExecutionId\") ??\n nestedParams.get(\"workflowId\") ??\n workflowId;\n }\n }\n }\n\n return {\n accountId: accountId || undefined,\n workflowId: workflowId || undefined,\n rawStatus,\n allParams,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Webflow Result Resolver\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Evalua los datos de respuesta del backend para determinar si la verificacion\n * del flujo Hosted Webflow fue exitosa.\n *\n * Logica de decision (por prioridad):\n * 1. `valid: true` explicito → aprobado.\n * 2. `valid: false` explicito → rechazado.\n * 3. `decision.type === \"REJECTED\"` → rechazado.\n * 4. Extraccion con datos + (`decision.type === \"PASSED\"` o `\"WARNING\"`) → aprobado.\n * 5. Sin datos de extraccion → pendiente (retorna null).\n *\n * @returns `WebflowResult | null` -- null indica que la verificacion aun esta pendiente.\n */\nexport function resolveWebflowResult(\n rawData: unknown,\n accountId: string,\n workflowId: string\n): WebflowResult | null {\n if (!rawData || typeof rawData !== \"object\") return null;\n\n const data = rawData as Record<string, unknown>;\n\n // 1. Explicit valid flag (gateway-level verdict)\n if (data.valid === true) {\n return {\n valid: true,\n status: String(data.workflowStatus ?? data.status ?? \"APPROVED_VERIFIED\"),\n decision: data.decision as string | undefined,\n extraction: data.extraction as Record<string, unknown> | undefined,\n accountId,\n workflowId,\n data: rawData,\n };\n }\n\n if (data.valid === false) {\n return {\n valid: false,\n status: String(data.workflowStatus ?? data.status ?? \"REJECTED\"),\n decision: data.decision as string | undefined,\n accountId,\n workflowId,\n data: rawData,\n errorMessage:\n extractJumioMessage(rawData) || \"El documento fue rechazado durante la verificacion.\",\n };\n }\n\n // 2. Read decision type from nested capabilities structure\n const capData = data as {\n decision?: { type?: string };\n capabilities?: { extraction?: Array<Record<string, unknown>> };\n };\n\n const decisionType = capData?.decision?.type;\n const extractionArr = capData?.capabilities?.extraction ?? [];\n const extraction = extractionArr[0];\n const isExtractionEmpty =\n extraction !== undefined && Object.keys(extraction).length === 0;\n\n // 3. Hard rejection\n if (decisionType === \"REJECTED\") {\n return {\n valid: false,\n status: \"REJECTED\",\n decision: decisionType,\n accountId,\n workflowId,\n data: rawData,\n errorMessage:\n extractJumioMessage(rawData) || \"El documento fue rechazado por Jumio.\",\n };\n }\n\n // 4. Approved: extraction with data + PASSED or WARNING decision\n if (extraction && !isExtractionEmpty) {\n const isApproved = decisionType === \"PASSED\" || decisionType === \"WARNING\";\n return {\n valid: isApproved,\n status: isApproved\n ? (decisionType ?? \"PASSED\")\n : (decisionType ?? \"REJECTED\"),\n decision: decisionType,\n extraction: extraction as Record<string, unknown>,\n accountId,\n workflowId,\n data: rawData,\n ...(!isApproved\n ? {\n errorMessage:\n extractJumioMessage(rawData) ||\n \"La verificacion no fue aprobada.\",\n }\n : {}),\n };\n }\n\n // 5. Pending\n return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Webflow Poller\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Sondea periodicamente el estado de verificacion de un flujo Hosted Webflow de Jumio.\n *\n * Continua consultando hasta:\n * - Obtener un resultado definitivo (aprobado, rechazado o `valid` explicito).\n * - Agotar el numero maximo de intentos (lanza `JumioPollingTimeoutError`).\n * - Recibir una senal de cancelacion (lanza `JumioAbortError`).\n *\n * @param http Instancia del cliente HTTP de Jumio.\n * @param params Parametros de la verificacion.\n * @param options Opciones de configuracion del sondeo.\n * @returns `WebflowResult` con el resultado definitivo.\n */\nexport async function pollWebflowStatus(\n http: JumioHttpClient,\n params: { accountId: string; workflowId: string; clientId?: string },\n options: PollWebflowOptions = {}\n): Promise<WebflowResult> {\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 lastRawData: unknown = {};\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n if (signal?.aborted) {\n throw new JumioAbortError();\n }\n\n const responseData = await withRetry(\n () =>\n http.getVerificationStatus<unknown>(params.accountId, params.workflowId, {\n signal,\n timeout: config.statusTimeout,\n clientId: params.clientId,\n }),\n {\n maxRetries: config.maxRetries ?? 3,\n initialDelayMs: config.retryDelayMs ?? 800,\n signal,\n }\n );\n\n // Unwrap envelope: supports { data: ... } and { values: { data: ... } }\n const firstLevel = extractEnvelopeData<unknown>(responseData);\n const statusData = extractNestedData(firstLevel) ?? {};\n lastRawData = statusData;\n\n options.onAttempt?.(attempt, maxAttempts, statusData);\n\n // Try to resolve the result\n const result = resolveWebflowResult(\n statusData,\n params.accountId,\n params.workflowId\n );\n if (result !== null) {\n return result;\n }\n\n // Still pending -- wait before next attempt\n if (attempt < maxAttempts) {\n await delay(intervalMs, signal);\n }\n }\n\n const lastMessage =\n extractJumioMessage(lastRawData) ||\n \"La verificacion Jumio sigue en proceso. Intenta nuevamente en unos momentos.\";\n\n throw new JumioPollingTimeoutError(maxAttempts, lastMessage, lastRawData);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Webflow Session Starter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Inicia el flujo Hosted Webflow solicitando al backend la URL de verificacion de Jumio.\n *\n * @param http Instancia del cliente HTTP de Jumio.\n * @param config Configuracion del cliente (para leer `redirectProxyUrl`).\n * @param input Parametros de inicio del flujo.\n * @returns `StartWebflowResult` con el `href` de Jumio y datos adicionales.\n */\nexport async function startWebflowSession(\n http: JumioHttpClient,\n config: JumioClientConfig,\n input: StartWebflowInput\n): Promise<StartWebflowResult> {\n const {\n clientId,\n successUrl,\n errorUrl,\n useRedirectProxy = false,\n autoRedirect = false,\n openInNewTab = false,\n signal,\n } = input;\n\n if (!clientId?.trim()) {\n throw new JumioValidationError(\n \"Se requiere un identificador de cliente valido (clientId).\"\n );\n }\n if (!successUrl?.trim()) {\n throw new JumioValidationError(\"Se requiere la URL de exito (successUrl).\");\n }\n if (!errorUrl?.trim()) {\n throw new JumioValidationError(\"Se requiere la URL de error (errorUrl).\");\n }\n\n if (signal?.aborted) {\n throw new JumioAbortError();\n }\n\n // Build the final redirect URLs\n const proxyUrl = useRedirectProxy\n ? (config.redirectProxyUrl ?? undefined)\n : undefined;\n const finalSuccessUrl = buildRedirectUrl(successUrl, proxyUrl);\n const finalErrorUrl = buildRedirectUrl(errorUrl, proxyUrl);\n\n try {\n // POST to the Jumio endpoint\n const responseData = await withRetry(\n () =>\n http.postVerification<unknown>(\n {\n client: clientId.trim(),\n successUrl: finalSuccessUrl,\n errorUrl: finalErrorUrl,\n },\n { signal, timeout: config.requestTimeout }\n ),\n {\n maxRetries: config.maxRetries ?? 3,\n initialDelayMs: config.retryDelayMs ?? 800,\n signal,\n }\n );\n\n // Unwrap envelope\n const firstLevel = extractEnvelopeData<unknown>(responseData);\n const payload = (extractNestedData(firstLevel) ?? {}) as Record<string, unknown>;\n\n const href = payload?.href as string | undefined;\n\n if (!href) {\n throw new JumioError(\n extractJumioMessage(payload) ||\n \"El backend no devolvio la URL de verificacion de Jumio (href).\",\n { rawData: payload }\n );\n }\n\n const result: StartWebflowResult = {\n href,\n accountId: payload?.accountId as string | undefined,\n workflowId: payload?.workflowId as string | undefined,\n data: payload,\n };\n\n // Navigation handling in browser environments\n if (typeof window !== \"undefined\") {\n if (openInNewTab) {\n const win = window.open(href, \"_blank\");\n // Fallback to same-tab redirect if pop-up blocker prevented opening a new tab\n if (!win || win.closed || typeof win.closed === \"undefined\") {\n window.location.href = href;\n }\n } else if (autoRedirect) {\n window.location.href = href;\n }\n }\n\n return result;\n } catch (err) {\n throw err;\n }\n}\n\n\n\n\n// Re-export GetWebflowStatusInput to avoid unused import warning\nexport type { GetWebflowStatusInput };\r\n","export * from \"./types\";\r\nexport * from \"./errors\";\r\nexport * from \"./envelope\";\r\nexport * from \"./retry\";\r\nexport * from \"./image\";\r\nexport * from \"./http\";\r\nexport * from \"./polling\";\r\nexport * from \"./webflow\";\r\nexport * from \"./client\";\r\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 axios, { AxiosError, AxiosInstance } from \"axios\";\r\nimport {\r\n JumioAbortError,\r\n JumioError,\r\n JumioNetworkError,\r\n JumioTimeoutError,\r\n} from \"./errors\";\r\nimport { extractJumioMessage } from \"./envelope\";\r\nimport type { JumioClientConfig } from \"./types\";\r\n\r\nexport class JumioHttpClient {\r\n private readonly client: AxiosInstance;\r\n private readonly config: JumioClientConfig;\r\n\r\n constructor(config: JumioClientConfig = {}) {\r\n this.config = {\r\n baseUrl: \"https://front.dynamicore.io\",\r\n endpoint: \"/marketplace/apps/jumio\",\r\n requestTimeout: 180000,\r\n statusTimeout: 120000,\r\n maxRetries: 3,\r\n retryDelayMs: 800,\r\n pollingIntervalMs: 10000,\r\n maxPollingAttempts: 20,\r\n authTokenPrefix: \"\",\r\n ...config,\r\n };\r\n\r\n if (config.axiosInstance) {\r\n this.client = config.axiosInstance;\r\n } else {\r\n this.client = axios.create({\r\n baseURL: this.config.baseUrl,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n ...(this.config.context ? { context: this.config.context } : {}),\r\n ...(this.config.customHeaders || {}),\r\n },\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Resuelve los headers dinámicos (token de auth y context).\r\n */\r\n private async resolveHeaders(): Promise<Record<string, string>> {\r\n const headers: Record<string, string> = {\r\n ...(this.config.customHeaders || {}),\r\n };\r\n\r\n if (this.config.context) {\r\n headers[\"context\"] = this.config.context;\r\n }\r\n\r\n if (this.config.authToken) {\r\n let token: string | undefined | null;\r\n if (typeof this.config.authToken === \"function\") {\r\n token = await this.config.authToken();\r\n } else {\r\n token = this.config.authToken;\r\n }\r\n\r\n if (token) {\r\n const prefix = this.config.authTokenPrefix ? `${this.config.authTokenPrefix.trim()} ` : \"\";\r\n headers[\"Authorization\"] = `${prefix}${token}`;\r\n }\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Normaliza cualquier error de Axios a una excepción tipada JumioError.\r\n */\r\n private normalizeError(error: unknown): JumioError {\r\n if (error instanceof JumioError) {\r\n return error;\r\n }\r\n\r\n if (axios.isAxiosError(error)) {\r\n const axiosErr = error as AxiosError;\r\n const status = axiosErr.response?.status;\r\n const responseData = axiosErr.response?.data;\r\n const serverMessage = extractJumioMessage(responseData) || extractJumioMessage(axiosErr);\r\n\r\n if (axiosErr.code === \"ECONNABORTED\" || axiosErr.code === \"ETIMEDOUT\") {\r\n return new JumioTimeoutError(\r\n serverMessage || \"La solicitud al servicio de Jumio excedió el tiempo límite.\",\r\n responseData\r\n );\r\n }\r\n\r\n if (!axiosErr.response) {\r\n return new JumioNetworkError(\r\n serverMessage || \"No fue posible comunicarse con el servicio de Jumio.\",\r\n axiosErr\r\n );\r\n }\r\n\r\n return new JumioError(serverMessage || `Error en la solicitud HTTP (${status}).`, {\r\n statusCode: status,\r\n rawData: responseData,\r\n code: axiosErr.code,\r\n cause: axiosErr,\r\n });\r\n }\r\n\r\n if (error instanceof Error) {\r\n if (error.name === \"AbortError\") {\r\n return new JumioAbortError();\r\n }\r\n return new JumioError(error.message, { cause: error });\r\n }\r\n\r\n return new JumioError(\"Ocurrió un error inesperado al contactar a Jumio.\");\r\n }\r\n\r\n /**\r\n * Ejecuta una petición POST al endpoint de Jumio para iniciar o procesar la verificación.\r\n */\r\n public async postVerification<T>(\r\n payload: unknown,\r\n options?: { signal?: AbortSignal; timeout?: number }\r\n ): Promise<T> {\r\n if (options?.signal?.aborted) {\r\n throw new JumioAbortError();\r\n }\r\n\r\n try {\r\n const dynamicHeaders = await this.resolveHeaders();\r\n const endpoint = this.config.endpoint || \"/marketplace/apps/jumio\";\r\n const timeout = options?.timeout ?? this.config.requestTimeout ?? 180000;\r\n\r\n const response = await this.client.post<T>(endpoint, payload, {\r\n headers: dynamicHeaders,\r\n timeout,\r\n signal: options?.signal,\r\n });\r\n\r\n return response.data;\r\n } catch (err) {\r\n throw this.normalizeError(err);\r\n }\r\n }\r\n\r\n /**\r\n * Ejecuta una petición GET para consultar el estado actual de una verificación de INE.\r\n * Soporta un `clientId` opcional requerido por algunos endpoints de DynamiCore (p. ej. Hosted Webflow).\r\n */\r\n public async getVerificationStatus<T>(\r\n accountId: string,\r\n workflowId: string,\r\n options?: { signal?: AbortSignal; timeout?: number; clientId?: string }\r\n ): Promise<T> {\r\n if (options?.signal?.aborted) {\r\n throw new JumioAbortError();\r\n }\r\n\r\n try {\r\n const dynamicHeaders = await this.resolveHeaders();\r\n const endpoint = this.config.endpoint || \"/marketplace/apps/jumio\";\r\n const timeout = options?.timeout ?? this.config.statusTimeout ?? 120000;\r\n\r\n const queryParams: Record<string, string> = {\r\n type: \"ine\",\r\n accountId,\r\n workflowId,\r\n };\r\n\r\n if (options?.clientId) {\r\n queryParams.clientId = options.clientId;\r\n }\r\n\r\n const response = await this.client.get<T>(endpoint, {\r\n params: queryParams,\r\n headers: dynamicHeaders,\r\n timeout,\r\n signal: options?.signal,\r\n });\r\n\r\n return response.data;\r\n } catch (err) {\r\n throw this.normalizeError(err);\r\n }\r\n }\r\n\r\n public getConfig(): Readonly<JumioClientConfig> {\r\n return this.config;\r\n }\r\n}\r\n","import {\r\n extractEnvelopeData,\r\n extractJumioMessage,\r\n extractNestedData,\r\n isFinalJumioStatus,\r\n isPassedJumioDecision,\r\n resolveVerificationValidity,\r\n} from \"./envelope\";\r\nimport {\r\n JumioAbortError,\r\n JumioPollingTimeoutError,\r\n} from \"./errors\";\r\nimport type { JumioHttpClient } from \"./http\";\r\nimport { delay, withRetry } from \"./retry\";\r\nimport type { JumioVerificationData, PollStatusOptions, VerifyIneResult } from \"./types\";\r\n\r\n/**\r\n * Sondea activamente el estado de verificación de un workflow de Jumio hasta alcanzar un estado definitivo.\r\n */\r\nexport async function pollJumioStatus(\r\n http: JumioHttpClient,\r\n accountId: string,\r\n workflowId: string,\r\n options: PollStatusOptions = {}\r\n): Promise<VerifyIneResult> {\r\n const config = http.getConfig();\r\n const maxAttempts = options.maxAttempts ?? config.maxPollingAttempts ?? 20;\r\n const intervalMs = options.pollingIntervalMs ?? config.pollingIntervalMs ?? 10000;\r\n const signal = options.signal;\r\n\r\n let lastData: JumioVerificationData = {};\r\n\r\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\r\n if (signal?.aborted) {\r\n throw new JumioAbortError();\r\n }\r\n\r\n // Consulta de estado protegida con reintentos para fallas transitorias de red\r\n const responseData = await withRetry(\r\n () =>\r\n http.getVerificationStatus<unknown>(accountId, workflowId, {\r\n signal,\r\n timeout: config.statusTimeout,\r\n }),\r\n {\r\n maxRetries: config.maxRetries ?? 3,\r\n initialDelayMs: config.retryDelayMs ?? 800,\r\n signal,\r\n }\r\n );\r\n\r\n const firstLevel = extractEnvelopeData<unknown>(responseData);\r\n const statusData = (extractNestedData(firstLevel) as JumioVerificationData) ?? {};\r\n lastData = statusData;\r\n\r\n options.onAttempt?.(attempt, maxAttempts, statusData);\r\n\r\n // 1. Si la respuesta trae explícitamente valid: true\r\n if (statusData.valid === true) {\r\n return {\r\n valid: true,\r\n status: (statusData.workflowStatus || statusData.status || \"APPROVED_VERIFIED\") as string,\r\n accountId,\r\n workflowId,\r\n data: statusData,\r\n };\r\n }\r\n\r\n const workflowStatus =\r\n statusData.workflowStatus ?? statusData.status ?? statusData.decision;\r\n\r\n // 2. Si el estado es final (o la decisión ya es un veredicto de aprobado)\r\n if (\r\n isFinalJumioStatus(workflowStatus) ||\r\n (statusData.decision && isPassedJumioDecision(statusData.decision))\r\n ) {\r\n // El veredicto se resuelve priorizando los campos explícitos `valid` y\r\n // `decision` sobre `workflowStatus` (p. ej. `PROCESSED` + `NOT_EXECUTED`\r\n // es un rechazo, no una aprobación).\r\n const isValid = resolveVerificationValidity(statusData, workflowStatus);\r\n const errorMessage = isValid\r\n ? undefined\r\n : extractJumioMessage(statusData) || \"El documento fue rechazado durante la validación.\";\r\n\r\n return {\r\n valid: isValid,\r\n status: String(workflowStatus),\r\n accountId,\r\n workflowId,\r\n data: statusData,\r\n errorMessage,\r\n };\r\n }\r\n\r\n // Si aún no es el último intento, esperar el intervalo\r\n if (attempt < maxAttempts) {\r\n await delay(intervalMs, signal);\r\n }\r\n }\r\n\r\n // Si se agotaron los intentos sin resolución final\r\n const lastMessage =\r\n extractJumioMessage(lastData) ||\r\n \"La validación de INE sigue en proceso. Intenta nuevamente en unos momentos.\";\r\n\r\n throw new JumioPollingTimeoutError(maxAttempts, lastMessage, lastData);\r\n}\r\n","import {\r\n extractEnvelopeData,\r\n extractJumioMessage,\r\n extractNestedData,\r\n isFinalJumioStatus,\r\n} from \"./envelope\";\r\nimport {\r\n JumioAbortError,\r\n JumioError,\r\n JumioValidationError,\r\n} from \"./errors\";\r\nimport { JumioHttpClient } from \"./http\";\r\nimport { resolveImageSourceToBase64 } from \"./image\";\r\nimport { pollJumioStatus } from \"./polling\";\r\nimport { withRetry } from \"./retry\";\r\nimport {\r\n buildRedirectUrl,\r\n parseWebflowReturnParams,\r\n pollWebflowStatus,\r\n startWebflowSession,\r\n} from \"./webflow\";\r\nimport type {\r\n GetWebflowStatusInput,\r\n ImageSource,\r\n JumioClientConfig,\r\n JumioIneStartData,\r\n JumioProgressCallback,\r\n JumioVerificationData,\r\n JumioVerificationPayload,\r\n PollStatusOptions,\r\n PollWebflowOptions,\r\n StartWebflowInput,\r\n StartWebflowResult,\r\n VerifyIneInput,\r\n VerifyIneResult,\r\n WebflowResult,\r\n WebflowReturnParams,\r\n} from \"./types\";\r\n\r\n\r\n/**\r\n * Cliente principal para gestionar validaciones de identidad mediante Jumio.\r\n */\r\nexport class JumioClient {\r\n private readonly http: JumioHttpClient;\r\n private readonly config: JumioClientConfig;\r\n\r\n constructor(config: JumioClientConfig = {}) {\r\n this.config = config;\r\n this.http = new JumioHttpClient(config);\r\n }\r\n\r\n /**\r\n * Inicia el proceso de verificación convirtiendo las imágenes y enviando el payload inicial a Jumio.\r\n */\r\n public async startIneVerification(params: {\r\n clientId: string;\r\n frontImage: ImageSource;\r\n backImage: ImageSource;\r\n signal?: AbortSignal;\r\n onProgress?: JumioProgressCallback;\r\n }): Promise<JumioIneStartData> {\r\n const { clientId, frontImage, backImage, signal, onProgress } = params;\r\n\r\n if (!clientId || !clientId.trim()) {\r\n throw new JumioValidationError(\"Se requiere un identificador de cliente válido (clientId).\");\r\n }\r\n\r\n if (signal?.aborted) {\r\n throw new JumioAbortError();\r\n }\r\n\r\n onProgress?.(\"RESOLVING_IMAGES\", 10);\r\n\r\n // 1. Convertir ambas imágenes a Base64 puro\r\n const [frontBase64, backBase64] = await Promise.all([\r\n resolveImageSourceToBase64(frontImage, this.config.s3Signer, signal),\r\n resolveImageSourceToBase64(backImage, this.config.s3Signer, signal),\r\n ]);\r\n\r\n if (signal?.aborted) {\r\n throw new JumioAbortError();\r\n }\r\n\r\n onProgress?.(\"SENDING_PAYLOAD\", 40);\r\n\r\n const payload: JumioVerificationPayload = {\r\n client: clientId.trim(),\r\n front_image_b64: frontBase64,\r\n back_image_b64: backBase64,\r\n };\r\n\r\n // 2. Enviar a Jumio con reintentos para caídas o timeouts\r\n const response = await withRetry(\r\n () =>\r\n this.http.postVerification<unknown>(payload, {\r\n signal,\r\n timeout: this.config.requestTimeout,\r\n }),\r\n {\r\n maxRetries: this.config.maxRetries ?? 3,\r\n initialDelayMs: this.config.retryDelayMs ?? 800,\r\n signal,\r\n }\r\n );\r\n\r\n onProgress?.(\"PAYLOAD_SENT\", 60);\r\n\r\n // 3. Desempaquetar respuesta\r\n const firstLevel = extractEnvelopeData<unknown>(response);\r\n const startData = (extractNestedData(firstLevel) as JumioIneStartData) ?? {};\r\n\r\n return startData;\r\n }\r\n\r\n /**\r\n * Consulta una única vez el estado actual de la validación.\r\n */\r\n public async getIneStatus(\r\n accountId: string,\r\n workflowId: string,\r\n signal?: AbortSignal\r\n ): Promise<JumioVerificationData> {\r\n const response = await this.http.getVerificationStatus<unknown>(\r\n accountId,\r\n workflowId,\r\n { signal, timeout: this.config.statusTimeout }\r\n );\r\n const firstLevel = extractEnvelopeData<unknown>(response);\r\n return (extractNestedData(firstLevel) as JumioVerificationData) ?? {};\r\n }\r\n\r\n /**\r\n * Sondea periódicamente el estado hasta obtener un resultado definitivo.\r\n */\r\n public async pollIneStatus(\r\n accountId: string,\r\n workflowId: string,\r\n options?: PollStatusOptions\r\n ): Promise<VerifyIneResult> {\r\n return pollJumioStatus(this.http, accountId, workflowId, options);\r\n }\r\n\r\n /**\r\n * Ejecuta el flujo completo de validación de INE.\r\n *\r\n * @param input Parámetros de validación y callbacks.\r\n * @returns `VerifyIneResult` con el resultado inicial o definitivo según `awaitFinalStatus`.\r\n */\r\n public async verifyIne(input: VerifyIneInput): Promise<VerifyIneResult> {\r\n const {\r\n clientId,\r\n frontImage,\r\n backImage,\r\n awaitFinalStatus = false,\r\n onStatusResolved,\r\n onStatusError,\r\n onProgress,\r\n signal,\r\n } = input;\r\n\r\n // 1. Iniciar verificación y obtener datos iniciales\r\n const startData = await this.startIneVerification({\r\n clientId,\r\n frontImage,\r\n backImage,\r\n signal,\r\n onProgress,\r\n });\r\n\r\n // 2. Si la respuesta inicial ya trae un veredicto definitivo:\r\n // - `valid: true` explícito, o\r\n // - `valid: false` con workflow ya final (rechazo síncrono de la gateway).\r\n // En ambos casos se resuelve de inmediato sin requerir IDs de seguimiento.\r\n const startStatus =\r\n startData?.workflowStatus ?? startData?.status ?? startData?.decision;\r\n const isStartFinal = isFinalJumioStatus(startStatus);\r\n\r\n if (startData?.valid === true || (startData?.valid === false && isStartFinal)) {\r\n const isValid = startData?.valid === true;\r\n const immediateResult: VerifyIneResult = {\r\n valid: isValid,\r\n status: (startStatus || (isValid ? \"APPROVED_VERIFIED\" : \"REJECTED\")) as string,\r\n accountId: startData?.accountId,\r\n workflowId: startData?.workflowId,\r\n data: startData,\r\n ...(isValid\r\n ? {}\r\n : {\r\n errorMessage:\r\n extractJumioMessage(startData) ||\r\n \"El documento fue rechazado durante la validación.\",\r\n }),\r\n };\r\n\r\n onProgress?.(\"COMPLETED\", 100);\r\n onStatusResolved?.(immediateResult);\r\n return immediateResult;\r\n }\r\n\r\n const accountId = String(startData?.accountId ?? \"\").trim();\r\n const workflowId = String(startData?.workflowId ?? \"\").trim();\r\n\r\n if (!accountId || !workflowId) {\r\n const errorMessage =\r\n extractJumioMessage(startData) ||\r\n \"No fue posible obtener los identificadores de seguimiento de la validación.\";\r\n const error = new JumioError(errorMessage, { rawData: startData });\r\n onStatusError?.(error);\r\n throw error;\r\n }\r\n\r\n // 3. Flujo NO bloqueante (en segundo plano):\r\n if (!awaitFinalStatus) {\r\n onProgress?.(\"POLLING_BACKGROUND\", 70);\r\n\r\n // Lanzar sondeo en segundo plano desacoplado del señal del llamador:\r\n // al retornar de inmediato, la validación debe continuar aunque el\r\n // componente se desmonte (navegación, cierre de pantalla) o se aborte\r\n // el signal original. El signal solo aplica a la fase síncrona inicial.\r\n this.pollIneStatus(accountId, workflowId)\r\n .then((finalResult) => {\r\n onProgress?.(\"COMPLETED\", 100);\r\n onStatusResolved?.(finalResult);\r\n })\r\n .catch((err) => {\r\n const normalizedError =\r\n err instanceof Error ? err : new Error(\"No se pudo consultar el estatus de validación.\");\r\n onStatusError?.(normalizedError);\r\n });\r\n\r\n // Retorna éxito inicial para continuar la experiencia de usuario\r\n return {\r\n valid: true,\r\n status: (startData.status || startData.workflowStatus || \"INITIATED\") as string,\r\n accountId,\r\n workflowId,\r\n data: startData,\r\n };\r\n }\r\n\r\n // 4. Flujo bloqueante (espera sondeo hasta resultado final):\r\n onProgress?.(\"POLLING_FOREGROUND\", 70);\r\n\r\n const finalResult = await this.pollIneStatus(accountId, workflowId, { signal });\r\n onProgress?.(\"COMPLETED\", 100);\r\n onStatusResolved?.(finalResult);\r\n\r\n return finalResult;\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────\r\n // Hosted Webflow (Redirección)\r\n // ─────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Construye la URL de redirección de retorno para el flujo Hosted Webflow.\r\n *\r\n * Si el cliente está configurado con un `redirectProxyUrl` y `useProxy` es `true`,\r\n * la URL de retorno se codifica en Base64 URL-safe y se adjunta al proxy.\r\n *\r\n * @param returnUrl URL de la aplicación a la que Jumio redirigirá tras la verificación.\r\n * @param useProxy Si es `true` y hay `redirectProxyUrl` configurado, usa el proxy.\r\n * @returns URL de redirección construida.\r\n */\r\n public buildRedirectUrl(returnUrl: string, useProxy = false): string {\r\n const proxyUrl = useProxy ? (this.config.redirectProxyUrl ?? undefined) : undefined;\r\n return buildRedirectUrl(returnUrl, proxyUrl);\r\n }\r\n\r\n /**\r\n * Inicia el flujo Hosted Webflow solicitando al backend de DynamiCore la URL\r\n * de verificación de Jumio (`href`).\r\n *\r\n * El usuario debe ser redirigido a esa URL para completar la verificación en la\r\n * página oficial de Jumio. Al terminar, Jumio redirige de vuelta a la aplicación\r\n * con `accountId` y `workflowExecutionId` como query params.\r\n *\r\n * @param input Parámetros del flujo: `clientId`, `successUrl`, `errorUrl`, opciones de proxy y redirección.\r\n * @returns `StartWebflowResult` con la URL de Jumio (`href`) y datos adicionales.\r\n *\r\n * @example\r\n * ```ts\r\n * const { href } = await client.startWebflow({\r\n * clientId: \"usr_123\",\r\n * successUrl: \"https://app.example.com/verify/success\",\r\n * errorUrl: \"https://app.example.com/verify/error\",\r\n * });\r\n * window.location.href = href;\r\n * ```\r\n */\r\n public async startWebflow(input: StartWebflowInput): Promise<StartWebflowResult> {\r\n return startWebflowSession(this.http, this.config, input);\r\n }\r\n\r\n /**\r\n * Extrae los parámetros de seguimiento de Jumio de la URL de retorno.\r\n *\r\n * Jumio añade `accountId` y `workflowExecutionId` (o `workflowId`) como query\r\n * params al redirigir de vuelta a la aplicación tras la verificación.\r\n *\r\n * @param source URL completa, `URLSearchParams`, objeto con `search`/`href`, o nada para leer `window.location`.\r\n * @returns `WebflowReturnParams` con `accountId`, `workflowId`, `rawStatus` y todos los params.\r\n *\r\n * @example En React, en el componente de retorno:\r\n * ```ts\r\n * const { accountId, workflowId } = client.parseWebflowReturnParams(window.location.href);\r\n * ```\r\n */\r\n public parseWebflowReturnParams(\r\n source?: string | URLSearchParams | { search?: string; href?: string }\r\n ): WebflowReturnParams {\r\n return parseWebflowReturnParams(source);\r\n }\r\n\r\n /**\r\n * Consulta una única vez el estado actual de la verificación del flujo Hosted Webflow.\r\n *\r\n * @param input Parámetros de consulta: `accountId`, `workflowId`, y `clientId` opcional.\r\n * @returns `WebflowResult | null` — `null` si la verificación aún está pendiente.\r\n */\r\n public async getWebflowStatus(input: GetWebflowStatusInput): Promise<WebflowResult | null> {\r\n const { accountId, workflowId, clientId, signal } = input;\r\n const responseData = await this.http.getVerificationStatus<unknown>(accountId, workflowId, {\r\n signal,\r\n timeout: this.config.statusTimeout,\r\n clientId,\r\n });\r\n const firstLevel = extractEnvelopeData<unknown>(responseData);\r\n const statusData = extractNestedData(firstLevel) ?? {};\r\n\r\n const { resolveWebflowResult } = await import(\"./webflow\");\r\n return resolveWebflowResult(statusData, accountId, workflowId);\r\n }\r\n\r\n /**\r\n * Sondea periódicamente el estado de verificación de un flujo Hosted Webflow de Jumio.\r\n *\r\n * Continúa consultando hasta obtener un resultado definitivo o agotar los intentos.\r\n *\r\n * @param params `accountId`, `workflowId` y `clientId` opcional.\r\n * @param options Opciones de sondeo (`maxAttempts`, `pollingIntervalMs`, `signal`, `onAttempt`).\r\n * @returns `WebflowResult` con el resultado definitivo.\r\n *\r\n * @example\r\n * ```ts\r\n * // En el componente de retorno, tras leer los params de la URL:\r\n * const result = await client.pollWebflowStatus({ accountId, workflowId, clientId });\r\n * if (result.valid) {\r\n * console.log(\"Verificación aprobada:\", result.extraction);\r\n * } else {\r\n * console.warn(\"Rechazado:\", result.errorMessage);\r\n * }\r\n * ```\r\n */\r\n public async pollWebflowStatus(\r\n params: { accountId: string; workflowId: string; clientId?: string },\r\n options?: PollWebflowOptions\r\n ): Promise<WebflowResult> {\r\n return pollWebflowStatus(this.http, params, options);\r\n }\r\n}\r\n\r\n/**\r\n * Fábrica para crear una nueva instancia de `JumioClient`.\r\n */\r\nexport function createJumioClient(config?: JumioClientConfig): JumioClient {\r\n return new JumioClient(config);\r\n}\r\n"]}