@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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DynamiCore
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,272 @@
1
+ # @dynamicore/jumio-sdk
2
+
3
+ > SDK modular, tipado y agnóstico para la validación de identidad e identificación oficial (INE) mediante Jumio en el ecosistema DynamiCore.
4
+
5
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.7+-blue.svg)](https://www.typescriptlang.org/)
6
+ [![React](https://img.shields.io/badge/React-18%20%7C%2019-61dafb.svg)](https://react.dev/)
7
+ [![Dual ESM/CJS](https://img.shields.io/badge/Module-ESM%20%26%20CJS-green.svg)](#)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
+
10
+ ---
11
+
12
+ ## 🌟 Características
13
+
14
+ - **Agnóstico y Universal**: Funciona en cualquier entorno JavaScript/TypeScript (Next.js App/Pages router, React, React Native, Vite, Node.js, Express, Fastify).
15
+ - **Manejo Flexible de Imágenes**: Acepta `File`, `Blob`, `ArrayBuffer`, `Uint8Array`, strings en `Base64`, URLs públicas, URLs prefirmadas de S3 o rutas S3 con firmador personalizado.
16
+ - **Soporte de Flujos Asíncrono y Síncrono**:
17
+ - *No bloqueante* (`awaitFinalStatus: false`): Inicia la validación, responde de inmediato para no detener al usuario y ejecuta el sondeo (polling) en segundo plano notificando mediante callbacks.
18
+ - *Bloqueante* (`awaitFinalStatus: true`): Aguarda activamente hasta que Jumio resuelva la validación (`APPROVED_VERIFIED`, `REJECTED`, etc.).
19
+ - **Tolerancia a Fallos y Reintentos Automáticos**: Backoff exponencial configurable ante timeouts o caídas transitorias de red.
20
+ - **React Hook de Primera Clase**: `useJumioVerification` provee estados reactivos (`isLoading`, `isSubmitting`, `isPolling`, `progress`, `stage`, `result`, `error`) y cancelación con `AbortController`.
21
+ - **Tipado Estricto y Errores Específicos**: Jerarquía clara de errores (`JumioTimeoutError`, `JumioValidationError`, `JumioImageProcessingError`, etc.).
22
+ - **Bundle Dual Optimizado**: Salida ESM (`.js`) y CommonJS (`.cjs`) con source maps y definiciones TypeScript (`.d.ts`).
23
+
24
+ ---
25
+
26
+ ## 📦 Instalación
27
+
28
+ ### Desde npm / registro privado:
29
+ ```bash
30
+ npm install @dynamicore/jumio-sdk axios
31
+ # o con pnpm:
32
+ pnpm add @dynamicore/jumio-sdk axios
33
+ # o con yarn:
34
+ yarn add @dynamicore/jumio-sdk axios
35
+ ```
36
+
37
+ ### O en proyectos locales (Monorepo o Enlace local):
38
+ ```bash
39
+ npm install file:../jumio-sdk
40
+ ```
41
+
42
+ ---
43
+
44
+ ## 🚀 Guía de Uso
45
+
46
+ ### 1. Uso con React / Next.js (`useJumioVerification`)
47
+
48
+ ```tsx
49
+ import React, { useState } from "react";
50
+ import { useJumioVerification } from "@dynamicore/jumio-sdk/react";
51
+
52
+ export function IneVerificationStep({ clientId, onNext }: { clientId: string; onNext: () => void }) {
53
+ const [frontFile, setFrontFile] = useState<File | null>(null);
54
+ const [backFile, setBackFile] = useState<File | null>(null);
55
+
56
+ const {
57
+ verify,
58
+ isSubmitting,
59
+ isPolling,
60
+ isLoading,
61
+ stage,
62
+ progress,
63
+ result,
64
+ error,
65
+ reset,
66
+ } = useJumioVerification({
67
+ baseUrl: process.env.NEXT_PUBLIC_API_URL || "https://front.dynamicore.io",
68
+ context: process.env.NEXT_PUBLIC_DYNAMICORE_MORAL_CONTEXT,
69
+ // Callback cuando el sondeo en segundo plano resuelve el resultado final:
70
+ onStatusResolved: (res) => {
71
+ if (res.valid) {
72
+ alert("¡Tu INE ha sido validada exitosamente!");
73
+ } else {
74
+ alert(`No se pudo validar el INE: ${res.errorMessage || "Documento no legible"}`);
75
+ }
76
+ },
77
+ onStatusError: (err) => {
78
+ console.error("Error en validación en segundo plano:", err);
79
+ },
80
+ });
81
+
82
+ const handleSubmit = async (e: React.FormEvent) => {
83
+ e.preventDefault();
84
+ if (!frontFile || !backFile) return;
85
+
86
+ try {
87
+ // awaitFinalStatus: false permite avanzar en el flujo sin esperar 2 minutos
88
+ const res = await verify({
89
+ clientId,
90
+ frontImage: frontFile,
91
+ backImage: backFile,
92
+ awaitFinalStatus: false,
93
+ });
94
+
95
+ if (res.valid) {
96
+ onNext(); // Avanzar al siguiente paso del onboarding
97
+ }
98
+ } catch (err) {
99
+ console.error("Error al iniciar verificación:", err);
100
+ }
101
+ };
102
+
103
+ return (
104
+ <form onSubmit={handleSubmit} className="space-y-4">
105
+ <div>
106
+ <label>Frente de INE:</label>
107
+ <input
108
+ type="file"
109
+ accept="image/*"
110
+ onChange={(e) => setFrontFile(e.target.files?.[0] || null)}
111
+ />
112
+ </div>
113
+
114
+ <div>
115
+ <label>Reverso de INE:</label>
116
+ <input
117
+ type="file"
118
+ accept="image/*"
119
+ onChange={(e) => setBackFile(e.target.files?.[0] || null)}
120
+ />
121
+ </div>
122
+
123
+ {isLoading && (
124
+ <div>
125
+ <p>Estado: {stage} ({progress}%)</p>
126
+ {isSubmitting && <p>Subiendo y procesando imágenes...</p>}
127
+ {isPolling && <p>Verificando autenticidad en segundo plano...</p>}
128
+ </div>
129
+ )}
130
+
131
+ {error && <p className="text-red-500">{error.message}</p>}
132
+
133
+ <button type="submit" disabled={isLoading || !frontFile || !backFile}>
134
+ {isLoading ? "Validando..." : "Continuar"}
135
+ </button>
136
+ </form>
137
+ );
138
+ }
139
+ ```
140
+
141
+ ---
142
+
143
+ ### 2. Uso con TypeScript / Node.js / Core (`JumioClient`)
144
+
145
+ ```typescript
146
+ import { JumioClient, isJumioError } from "@dynamicore/jumio-sdk";
147
+
148
+ const jumio = new JumioClient({
149
+ baseUrl: "https://front.dynamicore.io",
150
+ context: "MI_CONTEXTO_NEGOCIO", // Contexto/tenant de tu aplicación en DynamiCore
151
+ authToken: () => getAuthTokenFromSession(), // Token estático o función async
152
+ // Opcional: Función para firmar URLs privadas de S3
153
+ s3Signer: async (path, expires) => {
154
+ return await myS3SignerService(path, expires);
155
+ },
156
+ });
157
+
158
+ async function runVerification() {
159
+ try {
160
+ const result = await jumio.verifyIne({
161
+ clientId: "usr_987654",
162
+ frontImage: "https://my-bucket.s3.amazonaws.com/uploads/ine_front.jpg",
163
+ backImage: "https://my-bucket.s3.amazonaws.com/uploads/ine_back.jpg",
164
+ awaitFinalStatus: true, // Espera resolución completa
165
+ });
166
+
167
+ if (result.valid) {
168
+ console.log("Validación completada con éxito:", result.data);
169
+ } else {
170
+ console.warn("Documento rechazado:", result.errorMessage);
171
+ }
172
+ } catch (error) {
173
+ if (isJumioError(error)) {
174
+ console.error(`Error Jumio [${error.code}]:`, error.message);
175
+ console.error("Detalle crudo:", error.rawData);
176
+ } else {
177
+ console.error("Error inesperado:", error);
178
+ }
179
+ }
180
+ }
181
+ ```
182
+
183
+ ---
184
+
185
+ ## 🛠️ Opciones de Configuración (`JumioClientConfig`)
186
+
187
+ | Parámetro | Tipo | Por defecto | Descripción |
188
+ | :--- | :--- | :--- | :--- |
189
+ | `baseUrl` | `string` | `"https://front.dynamicore.io"` | URL base de la API de DynamiCore. |
190
+ | `endpoint` | `string` | `"/marketplace/apps/jumio"` | Ruta del endpoint de verificación. |
191
+ | `context` | `string` | `undefined` | Contexto moral / de aplicación en header `context`. |
192
+ | `authToken` | `string \| (() => string \| Promise<string>)` | `undefined` | Token Bearer o proveedor dinámico. |
193
+ | `requestTimeout` | `number` | `180000` (3 min) | Timeout para el POST inicial de imágenes. |
194
+ | `statusTimeout` | `number` | `120000` (2 min) | Timeout para cada consulta de estatus. |
195
+ | `maxRetries` | `number` | `3` | Número de reintentos ante caídas transitorias. |
196
+ | `retryDelayMs` | `number` | `800` | Delay base de backoff para reintentos. |
197
+ | `pollingIntervalMs` | `number` | `10000` (10s) | Intervalo entre consultas sucesivas de estado. |
198
+ | `maxPollingAttempts` | `number` | `20` | Cantidad máxima de consultas antes de timeout. |
199
+ | `s3Signer` | `S3SignerFunction` | `undefined` | Función para firmar rutas privadas de S3. |
200
+ | `customHeaders` | `Record<string, string>` | `{}` | Headers HTTP personalizados. |
201
+ | `axiosInstance` | `AxiosInstance` | `undefined` | Instancia personalizada de Axios. |
202
+
203
+ ---
204
+
205
+ ## 🖼️ Formatos de Imagen Soportados
206
+
207
+ La librería detecta y convierte automáticamente cualquier formato a Base64 puro sin encabezados `data:image/...`:
208
+
209
+ 1. **`File` o `Blob`**: Obtenidos desde `<input type="file" />` o drag & drop.
210
+ 2. **`Base64` / `Data URL`**: Strings directos como `"data:image/jpeg;base64,..."` o Base64 crudo.
211
+ 3. **`URL Remota`**: URLs `https://...` públicas o con token de firma.
212
+ 4. **`Ruta S3`**: Rutas relativas como `"company/123/docs/ine.png"` (utiliza `s3Signer` para resolver la URL firmada).
213
+ 5. **`ArrayBuffer` / `Uint8Array`**: Datos binarios en memoria.
214
+
215
+ ---
216
+
217
+ ## 🚦 Estados y Veredicto (`valid` / `decision`)
218
+
219
+ > **Regla de oro:** el veredicto real de la verificación está en los campos `valid` y `decision`, **no** en `workflowStatus`. `workflowStatus: "PROCESSED"` solo significa que el workflow terminó de procesar; un `PROCESSED` + `decision: "NOT_EXECUTED"` es un **rechazo**, no una aprobación.
220
+
221
+ ### Estados del workflow (`JumioWorkflowStatus`)
222
+
223
+ - `PENDING` / `INITIATED`: En proceso de análisis por los motores de Jumio.
224
+ - `PROCESSED`: El workflow terminó de procesar. **No implica aprobación**: el veredicto se determina con `valid` / `decision`.
225
+ - `APPROVED_VERIFIED` / `DONE` / `COMPLETED`: Estados inequívocamente aprobados (fallback conservador).
226
+ - `REJECTED` / `FAILED` / `DENIED` / `EXPIRED` / `ABANDONED` / `NOT_READABLE` / `FRAUD` / `UNSUPPORTED_ID_TYPE`: Estados finales no válidos.
227
+
228
+ ### Precedencia del veredicto
229
+
230
+ El SDK resuelve la validez del resultado priorizando los campos explícitos:
231
+
232
+ 1. **`valid` booleano** (fuente de verdad de la gateway): `true` = aprobado, `false` = rechazado.
233
+ 2. **`decision`** presente: `PASSED` = aprobado; cualquier otro valor (`NOT_EXECUTED`, `REJECTED`, `FAILED`, etc.) = rechazado.
234
+ 3. **Fallback conservador** por `workflowStatus` (fail-closed): solo `APPROVED_VERIFIED` / `DONE` / `COMPLETED` cuentan como aprobados; si no hay `valid` ni `decision`, un `PROCESSED` se considera rechazado.
235
+
236
+ > Siempre lee `result.valid` en lugar de interpretar el payload crudo de Jumio.
237
+
238
+ ---
239
+
240
+ ## 🔄 Flujo No Bloqueante y Ciclo de Vida del Polling
241
+
242
+ Con `awaitFinalStatus: false` el SDK retorna de inmediato para no detener al usuario y ejecuta el sondeo (`polling`) en segundo plano consultando el estado del workflow hasta obtener un veredicto final:
243
+
244
+ - El polling en segundo plano está **desacoplado del `signal`** del llamador: continúa aunque el componente que lo inició se desmonte o se aborte la señal original (navegación, cierre de pantalla). El `signal` / `AbortController` solo aplica a la fase inicial síncrona (upload y consulta de arranque).
245
+ - El veredicto final llega a `onStatusResolved` (o a `isSuccess` / `isError` del hook); en caso de agotarse los `maxPollingAttempts` se invoca `onStatusError` con un `JumioPollingTimeoutError`.
246
+ - Si la respuesta inicial ya trae un veredicto definitivo (p. ej. `valid: false` + `workflowStatus: "PROCESSED"`), el SDK lo resuelve de inmediato sin requerir los identificadores de seguimiento.
247
+
248
+ ---
249
+
250
+ ## 🧪 Pruebas y Construcción
251
+
252
+ Para compilar y ejecutar la suite de pruebas del paquete:
253
+
254
+ ```bash
255
+ # Instalar dependencias
256
+ npm install
257
+
258
+ # Ejecutar pruebas unitarias
259
+ npm test
260
+
261
+ # Compilar para producción (ESM, CJS y .d.ts)
262
+ npm run build
263
+
264
+ # Verificación de tipos TypeScript
265
+ npm run typecheck
266
+ ```
267
+
268
+ ---
269
+
270
+ ## 📄 Licencia
271
+
272
+ MIT © DynamiCore
@@ -0,0 +1,252 @@
1
+ import { AxiosInstance } from 'axios';
2
+
3
+ /**
4
+ * Estados posibles del flujo de verificación en Jumio.
5
+ */
6
+ type JumioWorkflowStatus = "PENDING" | "INITIATED" | "ACQUIRED" | "SUBMITTED" | "PROCESSED" | "APPROVED_VERIFIED" | "REJECTED" | "FAILED" | "ERROR" | "DENIED" | "EXPIRED" | "ABANDONED" | (string & {});
7
+ /**
8
+ * Tipos de entrada soportados para las imágenes del documento.
9
+ */
10
+ type ImageSource = string | Blob | File | ArrayBuffer | Uint8Array | {
11
+ url?: unknown;
12
+ } | {
13
+ [key: string]: unknown;
14
+ };
15
+ /**
16
+ * Función personalizada para firmar URLs de S3 o descargar recursos privados.
17
+ */
18
+ type S3SignerFunction = (pathOrUrl: string, expires?: number) => Promise<string | {
19
+ url?: unknown;
20
+ } | unknown>;
21
+ /**
22
+ * Función o valor para proveer el token de autenticación.
23
+ */
24
+ type AuthTokenProvider = string | (() => string | undefined | null | Promise<string | undefined | null>);
25
+ /**
26
+ * Opciones de configuración para instanciar el cliente JumioClient.
27
+ */
28
+ interface JumioClientConfig {
29
+ /**
30
+ * URL base de la API de DynamiCore / Backend.
31
+ * @default "https://front.dynamicore.io"
32
+ */
33
+ baseUrl?: string;
34
+ /**
35
+ * Endpoint específico del servicio de verificación Jumio.
36
+ * @default "/marketplace/apps/jumio"
37
+ */
38
+ endpoint?: string;
39
+ /**
40
+ * Header de contexto moral / negocio enviado en las peticiones.
41
+ */
42
+ context?: string;
43
+ /**
44
+ * Token de autenticación o función que lo obtiene.
45
+ */
46
+ authToken?: AuthTokenProvider;
47
+ /**
48
+ * Prefijo para el header Authorization (por defecto vacío o "Bearer ").
49
+ * @default ""
50
+ */
51
+ authTokenPrefix?: string;
52
+ /**
53
+ * Timeout en milisegundos para las peticiones POST de verificación.
54
+ * @default 180000 (3 minutos)
55
+ */
56
+ requestTimeout?: number;
57
+ /**
58
+ * Timeout en milisegundos para las peticiones GET de status.
59
+ * @default 120000 (2 minutos)
60
+ */
61
+ statusTimeout?: number;
62
+ /**
63
+ * Número máximo de reintentos ante timeouts o fallas transitorias de red.
64
+ * @default 3
65
+ */
66
+ maxRetries?: number;
67
+ /**
68
+ * Delay base en milisegundos para el backoff exponencial de reintentos.
69
+ * @default 800
70
+ */
71
+ retryDelayMs?: number;
72
+ /**
73
+ * Intervalo en milisegundos entre consultas sucesivas de sondeo (polling).
74
+ * @default 10000 (10 segundos)
75
+ */
76
+ pollingIntervalMs?: number;
77
+ /**
78
+ * Número máximo de intentos de sondeo antes de timeout.
79
+ * @default 20 (20 x 10s = aprox 200 segundos)
80
+ */
81
+ maxPollingAttempts?: number;
82
+ /**
83
+ * Función opcional para firmar rutas u URLs de Amazon S3.
84
+ */
85
+ s3Signer?: S3SignerFunction;
86
+ /**
87
+ * Headers HTTP adicionales para incluir en cada petición.
88
+ */
89
+ customHeaders?: Record<string, string>;
90
+ /**
91
+ * Instancia personalizada de Axios (opcional).
92
+ */
93
+ axiosInstance?: AxiosInstance;
94
+ }
95
+ /**
96
+ * Payload enviado a la API de verificación de Jumio.
97
+ */
98
+ interface JumioVerificationPayload {
99
+ client: string;
100
+ front_image_b64: string;
101
+ back_image_b64: string;
102
+ [key: string]: unknown;
103
+ }
104
+ /**
105
+ * Estructura de respuesta de datos de verificación.
106
+ */
107
+ interface JumioVerificationData {
108
+ valid?: boolean;
109
+ status?: JumioWorkflowStatus;
110
+ workflowStatus?: JumioWorkflowStatus;
111
+ decision?: string;
112
+ accountId?: string;
113
+ workflowId?: string;
114
+ message?: string;
115
+ [key: string]: unknown;
116
+ }
117
+ /**
118
+ * Estructura inicial devuelta al iniciar el flujo de verificación.
119
+ */
120
+ interface JumioIneStartData extends JumioVerificationData {
121
+ accountId?: string;
122
+ workflowId?: string;
123
+ }
124
+ /**
125
+ * Resultado estructurado retornado por el cliente tras una validación.
126
+ */
127
+ interface VerifyIneResult {
128
+ /**
129
+ * Indica si la validación fue exitosa (true) o fallida/rechazada (false).
130
+ */
131
+ valid: boolean;
132
+ /**
133
+ * Estado actual o final del flujo de Jumio.
134
+ */
135
+ status?: JumioWorkflowStatus;
136
+ /**
137
+ * Identificador de cuenta en Jumio.
138
+ */
139
+ accountId?: string;
140
+ /**
141
+ * Identificador del workflow en Jumio.
142
+ */
143
+ workflowId?: string;
144
+ /**
145
+ * Datos completos devueltos por la API de Jumio/DynamiCore.
146
+ */
147
+ data: unknown;
148
+ /**
149
+ * Mensaje descriptivo o de error si la validación falló.
150
+ */
151
+ errorMessage?: string;
152
+ }
153
+ /**
154
+ * Callback ejecutado cuando el sondeo resuelve un estado final.
155
+ */
156
+ type JumioStatusResolvedCallback = (result: VerifyIneResult) => void;
157
+ /**
158
+ * Callback ejecutado si ocurre un error durante el sondeo o la petición.
159
+ */
160
+ type JumioStatusErrorCallback = (error: Error) => void;
161
+ /**
162
+ * Callback de progreso para reportar avances de conversión o polling.
163
+ */
164
+ type JumioProgressCallback = (stage: string, percent?: number) => void;
165
+ /**
166
+ * Parámetros de entrada para la función `verifyIne`.
167
+ */
168
+ interface VerifyIneInput {
169
+ /**
170
+ * Identificador único del cliente (persona, usuario o ID externo).
171
+ */
172
+ clientId: string;
173
+ /**
174
+ * Imagen frontal del documento (INE): URL, ruta S3, File, Blob o Base64.
175
+ */
176
+ frontImage: ImageSource;
177
+ /**
178
+ * Imagen trasera/reverso del documento (INE): URL, ruta S3, File, Blob o Base64.
179
+ */
180
+ backImage: ImageSource;
181
+ /**
182
+ * Si es `true`, la promesa espera hasta que Jumio resuelva el resultado final (bloqueante).
183
+ * Si es `false` (por defecto), inicia la validación, retorna de inmediato y ejecuta el sondeo en 2do plano.
184
+ * @default false
185
+ */
186
+ awaitFinalStatus?: boolean;
187
+ /**
188
+ * Callback invocado cuando se completa el proceso de validación (síncrono o en segundo plano).
189
+ */
190
+ onStatusResolved?: JumioStatusResolvedCallback;
191
+ /**
192
+ * Callback invocado ante errores no recuperables durante la validación o sondeo.
193
+ */
194
+ onStatusError?: JumioStatusErrorCallback;
195
+ /**
196
+ * Callback opcional para reportar etapas del proceso.
197
+ */
198
+ onProgress?: JumioProgressCallback;
199
+ /**
200
+ * Señal de cancelación (AbortSignal) para abortar peticiones o sondeo activo.
201
+ */
202
+ signal?: AbortSignal;
203
+ }
204
+ /**
205
+ * Opciones para el método de polling de estado.
206
+ */
207
+ interface PollStatusOptions {
208
+ pollingIntervalMs?: number;
209
+ maxAttempts?: number;
210
+ signal?: AbortSignal;
211
+ onAttempt?: (attempt: number, maxAttempts: number, lastData: unknown) => void;
212
+ }
213
+
214
+ /**
215
+ * Cliente principal para gestionar validaciones de identidad mediante Jumio.
216
+ */
217
+ declare class JumioClient {
218
+ private readonly http;
219
+ private readonly config;
220
+ constructor(config?: JumioClientConfig);
221
+ /**
222
+ * Inicia el proceso de verificación convirtiendo las imágenes y enviando el payload inicial a Jumio.
223
+ */
224
+ startIneVerification(params: {
225
+ clientId: string;
226
+ frontImage: ImageSource;
227
+ backImage: ImageSource;
228
+ signal?: AbortSignal;
229
+ onProgress?: JumioProgressCallback;
230
+ }): Promise<JumioIneStartData>;
231
+ /**
232
+ * Consulta una única vez el estado actual de la validación.
233
+ */
234
+ getIneStatus(accountId: string, workflowId: string, signal?: AbortSignal): Promise<JumioVerificationData>;
235
+ /**
236
+ * Sondea periódicamente el estado hasta obtener un resultado definitivo.
237
+ */
238
+ pollIneStatus(accountId: string, workflowId: string, options?: PollStatusOptions): Promise<VerifyIneResult>;
239
+ /**
240
+ * Ejecuta el flujo completo de validación de INE.
241
+ *
242
+ * @param input Parámetros de validación y callbacks.
243
+ * @returns `VerifyIneResult` con el resultado inicial o definitivo según `awaitFinalStatus`.
244
+ */
245
+ verifyIne(input: VerifyIneInput): Promise<VerifyIneResult>;
246
+ }
247
+ /**
248
+ * Fábrica para crear una nueva instancia de `JumioClient`.
249
+ */
250
+ declare function createJumioClient(config?: JumioClientConfig): JumioClient;
251
+
252
+ export { type AuthTokenProvider as A, type ImageSource as I, JumioClient as J, type PollStatusOptions as P, type S3SignerFunction as S, type VerifyIneInput as V, type JumioClientConfig as a, type JumioIneStartData as b, type JumioProgressCallback as c, type JumioStatusErrorCallback as d, type JumioStatusResolvedCallback as e, type JumioVerificationData as f, type JumioVerificationPayload as g, type JumioWorkflowStatus as h, type VerifyIneResult as i, createJumioClient as j };