> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/sdks/sdk-web/componentes/selphi-biometria-facial/resultados.md).

# Resultados

En esta página explicaremos las diferentes posibilidades para finalizar el proceso de captura del widget.

Cada detalle de cada evento (atributos, datos...) ha sido especificado en la página ([Eventos](/sdks/sdk-web/componentes/selphi-biometria-facial/eventos.md)).

## Casos de éxito

### Captura y extracción satisfactoria

En el momento en que se completa la captura de la plantilla biométrica, los resultados extraídos se ofrecerán en el evento `extractionFinish` ([enlace](/sdks/sdk-web/componentes/selphi-biometria-facial/eventos/extractionfinish.md)).

{% hint style="info" %}
Una vez que se emite este evento, la lógica para cargar la siguiente vista o widget debe implementarse adaptándose al contexto de la aplicación.
{% endhint %}

Hay un ejemplo:

```typescript
import { type ExtractionFinishEvent } from "@facephi/selphi-web-component";

const selphiWidget = document.querySelector('facephi-selphi-widget');
selphiWidget.addEventListener('extractionFinish', onExtractionFinish);

function onExtractionFinish(event: CustomEvent<ExtractionFinishEvent>) {
  const result = event.detail.detail;
  console.log('extractionFinish:', result);

  // Procesar los resultados en el backend
  saveResults(result.extractionData.bestImage, result.extractionData.templateRaw);

  // Cargar el siguiente widget o vista
  loadNextView();
}
```

***

## Casos de error

Se recomienda controlar los posibles errores que puedan ocurrir al procesar los datos obtenidos para evitar mal funcionamiento interno, uso incorrecto del widget o ataques de fuerza bruta.

### Códigos de error

El widget lanzará una excepción si ocurre cualquier error de uso o interno.

Las excepciones podrán ser de dos tipos:

* Excepción terminal: Error que se lanzará cuando el widget no puede continuar con su ejecución. Estos errores pueden darse en entornos o configuraciones erróneas.
* Excepción de extracción: Error que se lanzará durante el flujo de captura o extracción. Estos errores permiten reintentar el flujo del widget, ya que se deben a un uso incorrecto del widget por parte del usuario.

<table><thead><tr><th width="266.15625">Error</th><th width="87.30078125">Código</th><th>Descripción</th></tr></thead><tbody><tr><td><strong>Excepciones terminales</strong></td><td></td><td></td></tr><tr><td>AndroidWebViewBehaviour</td><td>SPI_227</td><td>Error producido tras la ejecución del componente en un WebView en un entorno android.</td></tr><tr><td>UnknownInternalError</td><td>SPI_235</td><td>Error interno en el widget. Si el error persiste será necesario contactar con el equipo de soporte de Facephi</td></tr><tr><td>CameraHardwareError</td><td>SPI_204</td><td>Error producido durante el acceso a cámaras del dispositivo.</td></tr><tr><td>PermissionsDenied</td><td>SPI_242</td><td>Error generado al no permitir los permisos necesarios para la ejecución del widget.</td></tr><tr><td>CameraPermissionDenied</td><td>SPI_201</td><td>Error al no conceder los permisos para utilizar la(s) cámara(s) del dispositivo.</td></tr><tr><td>MicrophonePermissionDenied</td><td>SPI_218</td><td>Error al no conceder los permisos para utilizar el(los) mocrófono(s) del dispositivo.</td></tr><tr><td>SettingsError</td><td>SPI_219</td><td>Error producido por una configuración incorrecta.</td></tr><tr><td>BrowserApiNotCompatible</td><td>SPI_220</td><td>Error producido por un navegador no compatible.</td></tr><tr><td>SpoofingDetected</td><td>SPI_221</td><td>Error generado al detectar un ataque de inyección en el widget.</td></tr><tr><td>ActiveLivenessError</td><td>SPI_205</td><td>Error generado al fallar la prueba de vida activa en la ejecución del widget.</td></tr><tr><td><strong>Excepciones de extracción</strong></td><td></td><td></td></tr><tr><td>ErrorTimeout</td><td>SPI_001</td><td>Error generado al haber superado el límite de tiempo establecido para la extracción.</td></tr><tr><td>FaceNotFound</td><td>SPI_222</td><td>Error generado al no encontrar un rostro durante el proceso de captura.</td></tr><tr><td>EyesNotFound</td><td>SPI_223</td><td>Error generado al no detectar los ojos en el proceso de captura.</td></tr><tr><td>OccludedEyes</td><td>SPI_237</td><td>Error generado al reconocer los ojos tapados en el proceso de captura.</td></tr><tr><td>OccludedMouth</td><td>SPI_238</td><td>Error generado al reconocer la boca tapada en el proceso de captura.</td></tr><tr><td>DarkLightError</td><td>SPI_224</td><td>Error generado al detectar poca iluminación en el proceso de captura.</td></tr><tr><td>AngleExceeded</td><td>SPI_225</td><td>Error generado al detectar un angulo excesivo del rostro del usuario en el proceso de captura.</td></tr><tr><td>TooManyFaces</td><td>SPI_226</td><td>Error generado al detectar varios rostros en el proceso de captura.</td></tr><tr><td>NotStabilizedSunGlasses</td><td>SPI_223</td><td>Error generado al detectar gafas de son en el usuario en el proceso de captura.</td></tr><tr><td>NotStabilizedNoColor</td><td>SPI_224</td><td>Error generado al no detectar color en el proceso de captura.</td></tr></tbody></table>

***

### Límite de tiempo excedido durante la captura de la plantilla biométrica

Con los eventos `extractionTimeout` ([enlace](/sdks/sdk-web/componentes/selphi-biometria-facial/eventos/extractiontimeout.md)) y `timeoutErrorButtonClick` ([enlace](/sdks/sdk-web/componentes/selphi-biometria-facial/eventos/timeouterrorbuttonclick.md)) es posible controlar cuándo el usuario excede el tiempo asignado o los intentos utilizados.

Hay un ejemplo:

```typescript
import { type ExtractionTimeoutEvent, type TimeoutButtonClickEvent } from "@facephi/selphi-web-component";

const selphiWidget = document.querySelector('facephi-selphi-widget');
selphiWidget.addEventListener('extractionTimeout', onErrorTimeout);
selphiWidget.addEventListener('timeoutErrorButtonClick', onTimeoutButtonClick);
let userRetries = 0;

// El usuario no ha completado la extracción del patrón facial dentro del tiempo permitido
const onExtractionTimeout = (event: CustomEvent<ExtractionTimeoutEvent>) => {
  if (userRetries >= 3) {
    // Redirigir al usuario a una vista de error
    showRetriesExceededView();
  }
}

// El usuario ha hecho clic en el botón para reintentar la extracción en la vista de tiempo de espera del widget
const onTimeoutButtonClick = (event: CustomEvent<TimeoutButtonClickEvent>) => {
  userRetries++;
}
```

***

### Intentos de captura agotados

Como alternativa al recuento manual del apartado anterior, la propiedad [maxAttempts](/sdks/sdk-web/componentes/selphi-biometria-facial/propiedades/maxattempts.md) delega el límite de intentos en el propio widget. Cuando se agotan, el widget deja de reintentar y emite `maxAttemptsExceeded` ([enlace](/sdks/sdk-web/componentes/selphi-biometria-facial/eventos/maxattemptsexceeded.md)).

Hay un ejemplo:

```typescript
import { type MaxAttemptsExceededEvent } from "@facephi/selphi-web-component";

const selphiWidget = document.querySelector('facephi-selphi-widget');
selphiWidget.maxAttempts = 3;
selphiWidget.addEventListener('maxAttemptsExceeded', onMaxAttemptsExceeded);

// El usuario ha consumido todos los intentos de captura permitidos
function onMaxAttemptsExceeded(event: CustomEvent<MaxAttemptsExceededEvent>) {
  const detail = event.detail.detail;
  console.log('maxAttemptsExceeded:', detail.message);

  // Redirigir al usuario a una vista de error
  showRetriesExceededView();
}
```

***

### El usuario cierra el widget antes de la captura del documento

Este evento se emite cuando el usuario hace clic en el ícono de salir del widget para cancelar el proceso de extracción. Una vez que se presiona el botón, el widget se cerrará.

Ejemplo de código

```typescript
import { type UserCancelEvent } from "@facephi/selphi-web-component";
  
const selphiWidget = document.querySelector('facephi-selphi-widget');
selphiWidget.addEventListener('userCancel', handleUserCancel);

// El usuario ha hecho clic en el ícono de salir del widget para cancelar el proceso de extracción
function handleUserCancel(event: CustomEvent<UserCancelEvent>) {
  // Redirigir al usuario a la página principal del sitio web
  goLandingPage();
}
```

***

### Excepciones terminales durante el ciclo de vida del Widget

Este evento se emite cuando se detecta un mal funcionamiento del sistema. Se puede usar para identificar y filtrar diferentes tipos de errores encontrados durante el proceso de captura.

Ejemplo de código:

```typescript
import { type ExceptionCapturedEvent, type ErrorTimeoutEvent } from "@facephi/selphi-web-component";

const selphiWidget = document.querySelector('facephi-selphi-widget');
selphiWidget.addEventListener('exceptionCaptured', handleExceptionCaptured);
selphiWidget.addEventListener('errorTimeout', handleErrorTimeout);

// Se detecta un mal funcionamiento y el widget se ha detenido
function handleExceptionCaptured(event: CustomEvent<ExceptionCapturedEvent>) {
  const exceptionDetail = event.detail.detail;
  console.error('Widget Exception:', exceptionDetail.exceptionType);
}

// Se ha alcanzado el tiempo establecido en la propiedad `errorTimeout`
function handleErrorTimeout(event: CustomEvent<ErrorTimeoutEvent>) {
  const errorTimeoutDetail = event.detail.detail;
  // Redirigir al usuario a una vista de error
  showErrorView(errorTimeoutDetail.exceptionType);
}
```

***
