@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 +28 -5
- package/dist/{biometricDetection-8utmtR25.js → biometricDetection-CR31mETT.js} +15 -1
- package/dist/index.d.ts +44 -3
- package/dist/neoface-id-sdk.es.js +2804 -159
- package/dist/neoface-id-sdk.umd.js +1 -1
- package/dist/{qrcode-DYfGiWu6.js → qrcode-DZJ8v41k.js} +5 -6
- package/package.json +4 -2
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.
|
|
51
|
-
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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.
|
|
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),
|