ADR-026 — Escaneo de DNI con decodificador PDF417 propio (independiente del navegador)¶
Status: accepted (2026-08-23; enmienda a la estrategia de AC-22, reabierto por prueba
física en Samsung S24 / Chrome)
Context: El escaneo del DNI (AC-22) se apoyaba en BarcodeDetector (Shape Detection API
de Chromium). Prueba en dispositivo real (Samsung S24, Chrome de Android — el navegador más
común del público objetivo): el botón "Escanear DNI" NO aparece porque
getSupportedFormats() no incluye pdf417. Chrome de Android soporta QR pero no PDF417 sin
el módulo de códigos de Google Play Services; Samsung Internet y Firefox no traen
BarcodeDetector. Conclusión: la estrategia nativa deja el escaneo indisponible para la
mayoría del público de salón. La carga manual (fallback de AC-22) funciona, pero la feature
de conveniencia prácticamente no existe.
Alternatives:
Aceptar carga manual como principal (statu quo): cero costo, pero el "escaneá tu DNI" casi
nunca aparece.
Decodificador PDF417 en JS/WASM (elegido): funciona en TODOS los navegadores con cámara,
independiente de BarcodeDetector. Se carga lazy (dynamic import() al tocar
"Escanear"), así NO afecta el presupuesto de 3G de la primera pantalla (AC-24). Como el
decodificado es NUESTRO, controlamos el charset → la Ñ/acentos se resuelven de raíz
(cierra QA-L5, ya no es especulación).
Decision:
Integrar un decodificador PDF417 JS/WASM (evaluar zxing-wasm vs @zxing/library; elegir
el que decodifique de forma confiable el PDF417 del DNI argentino y permita manejar el
encoding Latin-1). Carga diferida en lib/dniScanner.ts (ya es un módulo dinámico).
BarcodeDetector queda como camino rápido OPCIONAL solo donde soporte pdf417; el
decodificador propio es el motor por defecto. El botón "Escanear DNI" se muestra en
cualquier navegador con cámara (getUserMedia), no solo donde hay BarcodeDetector.
Charset: el payload del DNI argentino se decodifica respetando su codificación real
(Latin-1/ISO-8859-1) para que apellidos con Ñ/acentos lleguen correctos al padrón.
Presupuesto: el decodificador NO entra al bundle inicial (lazy). El presupuesto de 60 KB
gzip de la primera pantalla se mantiene (AC-24).
Consequences: El escaneo funciona en todo el parque de teléfonos, no solo en un subconjunto
de Chrome. Dependencia nueva de la landing, pero fuera del camino crítico (lazy). ADR-015
("landing pelada") se enmienda: la restricción de peso aplica al bundle INICIAL; un módulo de
escaneo diferido está permitido porque no lo penaliza.
[ ] AC-48 — El botón "Escanear DNI" aparece en cualquier navegador con cámara (no depende de
BarcodeDetector); el decodificador PDF417 propio lee un DNI de prueba y autocompleta.
[ ] AC-49 — Charset: un payload PDF417 con apellido "PEÑA"/"MARÍA JOSÉ" decodifica con la Ñ y
los acentos correctos (unit test sobre el payload conocido — cierra QA-L5).
[ ] Bundle inicial de la landing sigue ≤ 60 KB gzip (el decodificador es lazy, AC-24).