Skip to main content

Tipos de Erro

O SDK categoriza erros em tipos específicos para facilitar o tratamento:
enum LivenessErrorType {
  INITIALIZATION_FAILED = 'INITIALIZATION_FAILED', // Falha na inicialização
  SESSION_FAILED = 'SESSION_FAILED', // Falha ao criar sessão
  CAPTURE_FAILED = 'CAPTURE_FAILED', // Falha na captura
  SUBMISSION_FAILED = 'SUBMISSION_FAILED', // Falha no envio
  CAMERA_PERMISSION_DENIED = 'CAMERA_PERMISSION_DENIED', // Permissão negada
  CAMERA_INJECTION_DETECTED = 'CAMERA_INJECTION_DETECTED', // Injeção detectada
  USER_CANCELLED = 'USER_CANCELLED', // Usuário cancelou
  NETWORK_ERROR = 'NETWORK_ERROR', // Erro de rede
  UNKNOWN_ERROR = 'UNKNOWN_ERROR', // Erro desconhecido
}

Estrutura do Erro

interface LivenessFailureError {
  type: LivenessErrorType; // Tipo do erro
  failureReason?: string; // Descrição detalhada (opcional)
}

Tratamento de Erros

Usando Callback

const config = {
  // ... outras configurações

  onFailure: (error) => {
    switch (error.type) {
      case 'CAMERA_PERMISSION_DENIED':
        mostrarMensagem(
          'Por favor, permita o acesso à câmera nas configurações do navegador.'
        );
        break;

      case 'CAMERA_INJECTION_DETECTED':
        mostrarMensagem(
          'Detectamos um problema com a câmera. Por favor, desative softwares de câmera virtual.'
        );
        break;

      case 'NETWORK_ERROR':
        mostrarMensagem(
          'Erro de conexão. Verifique sua internet e tente novamente.'
        );
        break;

      case 'SESSION_FAILED':
        mostrarMensagem(
          'Não foi possível iniciar a sessão. Tente novamente em alguns instantes.'
        );
        break;

      case 'CAPTURE_FAILED':
        mostrarMensagem(
          'Falha na captura: ' + (error.failureReason || 'Tente novamente')
        );
        break;

      case 'USER_CANCELLED':
        mostrarMensagem('Verificação cancelada pelo usuário.');
        break;

      default:
        mostrarMensagem('Ocorreu um erro inesperado. Tente novamente.');
        console.error('Erro:', error);
    }
  },
};

Usando try/catch

try {
  const result = await hub.run(config);
  processarResultado(result);
} catch (error) {
  if (error.type) {
    // Erro tipado do SDK
    tratarErroLiveness(error);
  } else {
    // Erro genérico
    console.error('Erro inesperado:', error);
  }
}

Mensagens Amigáveis

Converta erros técnicos em mensagens compreensíveis para o usuário:
function getMensagemAmigavel(error) {
  const mensagens = {
    CAMERA_PERMISSION_DENIED: {
      titulo: 'Acesso à Câmera Necessário',
      mensagem:
        'Para continuar, permita o acesso à câmera nas configurações do seu navegador.',
      acao: 'Verificar Permissões',
    },
    CAMERA_INJECTION_DETECTED: {
      titulo: 'Câmera Virtual Detectada',
      mensagem:
        'Detectamos um software de câmera virtual. Por favor, desative-o e use sua câmera real.',
      acao: 'Tentar Novamente',
    },
    NETWORK_ERROR: {
      titulo: 'Problema de Conexão',
      mensagem:
        'Não foi possível conectar ao servidor. Verifique sua internet.',
      acao: 'Tentar Novamente',
    },
    SESSION_EXPIRED: {
      titulo: 'Sessão Expirada',
      mensagem: 'Sua sessão expirou. Por favor, inicie novamente.',
      acao: 'Reiniciar',
    },
    CAPTURE_FAILED: {
      titulo: 'Falha na Captura',
      mensagem:
        'Não conseguimos capturar sua biometria. Tente novamente com boa iluminação.',
      acao: 'Tentar Novamente',
    },
  };

  return (
    mensagens[error.type] || {
      titulo: 'Erro Inesperado',
      mensagem: 'Ocorreu um problema. Por favor, tente novamente.',
      acao: 'Tentar Novamente',
    }
  );
}

Boas Práticas

Segurança

API Key

Nunca exponha a API Key no código frontend em produção. Use variáveis de ambiente ou carregue de um endpoint seguro.

Arquivo CEK

Mantenha o CEK em um endpoint com autenticação. Considere carregá-lo dinamicamente quando necessário.

HTTPS

O SDK requer conexão segura em produção. Sempre use HTTPS.

Validação

Valide os resultados no seu backend antes de confiar neles.

Performance

1

Pré-carregue o CEK

Carregue o CEK antes do usuário iniciar a verificação para evitar delays.
2

Container com dimensões fixas

Defina dimensões fixas no container para evitar reflows durante a renderização.
3

Cleanup adequado

Sempre chame teardown() ao desmontar o componente ou navegar para outra página.
// Exemplo de cleanup adequado
const hub = ValidHub.createHub();

try {
  const result = await hub.run(config);
  // processar resultado
} finally {
  // Garantir cleanup mesmo em caso de erro
  await hub.teardown();
}

Experiência do Usuário

Feedback Visual

Use os callbacks onProgress para mostrar feedback ao usuário durante cada etapa.

Mensagens Claras

Traduza os erros técnicos em mensagens compreensíveis para o usuário final.

Instruções Claras

Personalize as instruções para seu público-alvo usando hubOptions.strings.

Ambiente Adequado

Oriente o usuário sobre iluminação e posicionamento antes de iniciar a verificação.

Integração com Frameworks

Serviço Reutilizável

// livenessService.js
class LivenessService {
  constructor(config) {
    this.config = config;
    this.hub = null;
  }

  async carregarCEK(cekUrl) {
    const response = await fetch(cekUrl);
    if (!response.ok) {
      throw new Error('Falha ao carregar CEK');
    }
    return await response.json();
  }

  async verificar(options = {}) {
    if (typeof ValidHub === 'undefined') {
      throw new Error('SDK não carregado');
    }

    const cekData = await this.carregarCEK(this.config.cekUrl);
    this.hub = ValidHub.createHub();

    const hubConfig = {
      apiKey: this.config.apiKey,
      cek: cekData,
      mount: options.container || this.config.defaultContainer,
      backendBaseUrl: this.config.backendUrl,
      appName: this.config.appName,
      risk: options.risk || 'LIVENESS_RISK_HIGH',
      hubOptions: options.hubOptions,
      onProgress: options.onProgress,
      onSuccess: options.onSuccess,
      onFailure: options.onFailure,
    };

    try {
      const result = await this.hub.run(hubConfig);
      return result;
    } finally {
      this.hub = null;
    }
  }

  async cancelar() {
    if (this.hub) {
      await this.hub.teardown();
      this.hub = null;
    }
  }
}

// Uso
const livenessService = new LivenessService({
  apiKey: 'sua-api-key',
  cekUrl: '/config/production.cek.json',
  backendUrl: 'https://api.valid.com/liveness',
  appName: 'minha-aplicacao',
  defaultContainer: '#camera-container',
});

async function handleVerificacao() {
  try {
    const result = await livenessService.verificar({
      risk: 'LIVENESS_RISK_HIGH',
      hubOptions: {
        locale: 'pt-BR',
        colorTheme: { primaryColor: '#0066cc' },
      },
      onProgress: (state) => atualizarUI(state),
    });

    await enviarResultadoParaBackend(result);
  } catch (error) {
    tratarErro(error);
  }
}

Checklist de Verificação

Antes de reportar um problema, verifique os itens abaixo:
1

SDK Carregado

Confirme que o script do SDK foi carregado corretamente (ValidHub está disponível globalmente).
2

CEK Válido

O arquivo CEK está acessível e não expirou.
3

Credenciais

API Key e Backend URL estão corretos.
4

Container

O elemento container existe no DOM antes de chamar hub.run().
5

HTTPS

A página está sendo servida via HTTPS (obrigatório para acesso à câmera).
6

Permissões

O navegador tem permissão para acessar a câmera.

Referências