@neofaceid/web-sdk 2.1.1 → 2.1.3

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/README.md CHANGED
@@ -47,14 +47,15 @@ vai consumi-lo:
47
47
  1. **HTTPS.** O SDK acessa a câmera via `getUserMedia`, que exige contexto
48
48
  seguro. `localhost` funciona em desenvolvimento; produção precisa de
49
49
  HTTPS (recomendado configurar HSTS no servidor).
50
- 2. **`face-api.js` já vem como dependência transitiva** do
51
- `@neofaceid/web-sdk` (não precisa instalar de novo) — mas os **pesos do
50
+ 2. **O detector facial (`@vladmandic/face-api`, fork mantido do
51
+ `face-api.js`) já vem embutido** no `@neofaceid/web-sdk`, rodando sobre o
52
+ TF.js 4.x que o SDK instala como dependência (não precisa instalar nada) — mas os **pesos do
52
53
  modelo (weights) não são publicados no bundle** e precisam ser
53
54
  auto-hospedados pelo consumer. O SDK carrega os modelos em runtime via
54
55
  `faceapi.nets.<rede>.loadFromUri('/models')`, ou seja, relativos à própria
55
56
  origem do seu app. Baixe os arquivos abaixo do repositório oficial de
56
- pesos do face-api.js e sirva-os em `public/models/` (ou equivalente do seu
57
- bundler) para que fiquem acessíveis em `/models/*`:
57
+ pesos do face-api.js (o fork usa os mesmos arquivos) e sirva-os em
58
+ `public/models/` (ou equivalente do seu bundler) para que fiquem acessíveis em `/models/*`:
58
59
  - `tiny_face_detector_model-weights_manifest.json` +
59
60
  `tiny_face_detector_model-shard1`
60
61
  - `face_landmark_68_model-weights_manifest.json` +
@@ -62,7 +63,19 @@ vai consumi-lo:
62
63
 
63
64
  Sem esses arquivos em `/models`, qualquer fluxo que dependa de detecção
64
65
  facial local (blink detection do liveness, `biometricDetection`) falha ao
65
- carregar o modelo.
66
+ carregar o modelo. Se o manifest não for encontrado (404), o console
67
+ mostra um `console.error` acionável, com os 4 arquivos e o destino:
68
+
69
+ ```
70
+ [NeoFace ID SDK] Modelos de detecção facial não encontrados em /models/.
71
+ Copie os 4 arquivos abaixo para public/models/ (ou equivalente do seu bundler):
72
+ - tiny_face_detector_model-weights_manifest.json
73
+ - tiny_face_detector_model-shard1
74
+ - face_landmark_68_model-weights_manifest.json
75
+ - face_landmark_68_model-shard1
76
+ Fonte: https://github.com/vladmandic/face-api/tree/master/model
77
+ Sem esses arquivos em /models, o fluxo de detecção facial falhará silenciosamente.
78
+ ```
66
79
  3. **Ícone/logo do SDK não precisa de asset externo.** Desde a 1.29.0 a marca
67
80
  é renderizada via SVG inline (`src/assets/brand.ts`) — não há mais PNG
68
81
  para hospedar.
@@ -157,6 +170,7 @@ await startFaceLogin({
157
170
  appName: 'Minha Aplicação',
158
171
  onSuccess: result => console.log('Login ok:', result),
159
172
  onError: err => console.error(err.type, err.getFriendlyMessage()),
173
+ onAttemptError: (err, attempt) => analytics.track('biometric_attempt_failed', { attempt, type: err.type }),
160
174
  onCancel: () => console.log('Usuário cancelou'),
161
175
  onFallbackRequest: () => {
162
176
  /* opcional — default já abre EmailPasswordModal */
@@ -164,6 +178,15 @@ await startFaceLogin({
164
178
  });
165
179
  ```
166
180
 
181
+ > `onError` × `onAttemptError` (`BiometricLoginOptions`, NEO-563): `onError` é
182
+ > chamado quando o fluxo guiado **termina** — usuário cancelou, escolheu
183
+ > email/senha, ou erro fora do loop de tentativas (ex.: `CONSENT_DENIED`
184
+ > antes da câmera abrir). Já `onAttemptError` (opcional) é chamado a cada
185
+ > tentativa individual que falha **dentro** do loop (401, 429, rosto não
186
+ > detectado, etc.), antes de o `FallbackPrompt` interno aparecer — útil para
187
+ > registrar cada falha no seu próprio sistema de monitoramento sem esperar o
188
+ > fluxo encerrar.
189
+
167
190
  ### Login por mão / automático (`startHandLogin`, `startAutoLogin`)
168
191
 
169
192
  Mesma assinatura de `startFaceLogin` (`BiometricLoginOptions`); `startAutoLogin`
@@ -149,6 +149,20 @@ async function loadFaceApiModels() {
149
149
  console.warn("Não foi possível carregar modelos do face-api.js:", error);
150
150
  }
151
151
  }
152
+ async function initializeBiometricDetection() {
153
+ try {
154
+ if (typeof window !== "undefined") {
155
+ await loadFaceApiModels();
156
+ }
157
+ } catch (error) {
158
+ console.warn("Inicialização da detecção biométrica com limitações:", error);
159
+ }
160
+ }
161
+ function isAdvancedDetectionAvailable() {
162
+ return typeof window !== "undefined" && window.faceapi && window.faceapi.nets.tinyFaceDetector.isLoaded;
163
+ }
152
164
  export {
153
- detectBiometricType
165
+ detectBiometricType,
166
+ initializeBiometricDetection,
167
+ isAdvancedDetectionAvailable
154
168
  };
package/dist/index.d.ts CHANGED
@@ -63,7 +63,7 @@ export declare interface AuthorizationResult {
63
63
  }
64
64
 
65
65
  /**
66
- * NeoFaceSDK.authorize — autoriza uma operação por biometria, orquestrando
66
+ * authorize — autoriza uma operação por biometria, orquestrando
67
67
  * consent + captura + desafio de vivacidade (via runLivenessChallenge, NEO-408).
68
68
  *
69
69
  * O servidor sorteia a sequência de gestos, valida cada frame enviado e decide
@@ -199,7 +199,37 @@ export declare interface BiometricLoginOptions {
199
199
  */
200
200
  appName?: string;
201
201
  onSuccess: (result: BiometricLoginResult) => void;
202
+ /**
203
+ * Chamado quando o fluxo guiado **termina** — ou seja, quando o usuário
204
+ * cancela, escolhe entrar por email/senha, ou ocorre um erro fora do loop
205
+ * de tentativas (ex.: `CONSENT_DENIED` antes da câmera abrir).
206
+ *
207
+ * Nas falhas de reconhecimento que acontecem **dentro** do loop de
208
+ * tentativas (401, 429, rosto não detectado, etc.), o SDK exibe o
209
+ * `FallbackPrompt` internamente antes de propagar ao host. Use
210
+ * `onAttemptError` para ser notificado dessas falhas individuais.
211
+ */
202
212
  onError: (error: NeoFaceError) => void;
213
+ /**
214
+ * NEO-563 — Chamado a cada tentativa de login que falha, **antes** de o
215
+ * `FallbackPrompt` aparecer. Permite ao integrador registrar falhas
216
+ * individuais no próprio sistema de monitoramento.
217
+ *
218
+ * @param error O erro da tentativa que falhou.
219
+ * @param attempt Número da tentativa (começa em 1).
220
+ *
221
+ * @example
222
+ * ```ts
223
+ * startFaceLogin({
224
+ * applicationToken,
225
+ * onSuccess: r => console.log('ok', r),
226
+ * onError: err => console.error('fluxo encerrado', err),
227
+ * onAttemptError: (err, attempt) =>
228
+ * analytics.track('biometric_attempt_failed', { attempt, type: err.type }),
229
+ * });
230
+ * ```
231
+ */
232
+ onAttemptError?: (error: NeoFaceError, attempt: number) => void;
203
233
  onCancel?: () => void;
204
234
  onFallbackRequest?: () => void;
205
235
  countdown?: number;
@@ -981,6 +1011,11 @@ export declare const loginWithEmail: (email: string, password: string, applicati
981
1011
  */
982
1012
  export declare class NeoFaceError extends Error {
983
1013
  type: ErrorType;
1014
+ /**
1015
+ * NEO-562 · Presente quando o erro veio de um HTTP 429 (rate limit) — tempo
1016
+ * em ms sugerido pelo `Retry-After` da API antes de uma nova tentativa.
1017
+ */
1018
+ retryAfterMs?: number;
984
1019
  /**
985
1020
  * Constrói um erro do SDK com mensagem e tipo categórico.
986
1021
  * @param message Mensagem descritiva do erro (pode ser técnica)
@@ -1058,7 +1093,13 @@ export declare interface PersonalDataItem {
1058
1093
  }
1059
1094
 
1060
1095
  /**
1061
- * Pré-carrega modelos do face-api.js (chame no início da aplicação)
1096
+ * Pré-carrega modelos de detecção facial (chame no início da aplicação para
1097
+ * evitar o delay do primeiro `loadFromUri` durante a interação do usuário).
1098
+ *
1099
+ * Os modelos não são publicados no bundle do SDK — precisam ser auto-hospedados
1100
+ * pelo consumer em `/models/` (relativo à origem do app). Se os arquivos não
1101
+ * forem encontrados, um `console.error` acionável é emitido indicando o que
1102
+ * copiar e para onde.
1062
1103
  */
1063
1104
  export declare function preloadFaceDetectionModels(): Promise<void>;
1064
1105
 
@@ -1866,7 +1907,7 @@ export declare const validateToken: (applicationToken: string) => Promise<boolea
1866
1907
  * MINOR: Incrementado quando adicionamos funcionalidades mantendo compatibilidade
1867
1908
  * PATCH: Incrementado quando corrigimos bugs mantendo compatibilidade
1868
1909
  */
1869
- export declare const VERSION = "2.1.1";
1910
+ export declare const VERSION = "2.1.3";
1870
1911
 
1871
1912
  /**
1872
1913
  * Executa `fn(sessionId)`. Se o servidor devolver 410 (sessão consumida/expirada),