@@ -11,7 +11,6 @@ import type { NFCScanContext } from '@selfxyz/mobile-sdk-alpha';
1111import { logNFCEvent } from '@/Sentry' ;
1212import {
1313 type AndroidScanResponse ,
14- PassportReader ,
1514 reset ,
1615 scan as scanDocument ,
1716} from '@/utils/passportReader' ;
@@ -94,24 +93,8 @@ const scanIOS = async (
9493 inputs : Inputs ,
9594 context : Omit < NFCScanContext , 'stage' > ,
9695) => {
97- // Narrow type for iOS-specific method availability
98- const iosReader = PassportReader as
99- | ( typeof PassportReader & {
100- scanPassport ?: (
101- passportNumber : string ,
102- dateOfBirth : string ,
103- dateOfExpiry : string ,
104- canNumber : string ,
105- useCan : boolean ,
106- skipPACE : boolean ,
107- skipCA : boolean ,
108- extendedMode : boolean ,
109- usePacePolling : boolean ,
110- sessionId : string ,
111- ) => unknown ;
112- } )
113- | null ;
114- if ( ! iosReader ?. scanPassport ) {
96+ // Use normalized cross-platform scan to avoid duplicated iOS code paths
97+ if ( ! scanDocument ) {
11598 console . warn (
11699 'iOS passport scanner is not available - native module failed to load' ,
117100 ) ;
@@ -126,25 +109,24 @@ const scanIOS = async (
126109 ) ;
127110 }
128111
129- return await Promise . resolve (
130- iosReader . scanPassport (
131- inputs . passportNumber ,
132- inputs . dateOfBirth ,
133- inputs . dateOfExpiry ,
134- inputs . canNumber ?? '' ,
135- inputs . useCan ?? false ,
136- inputs . skipPACE ?? false ,
137- inputs . skipCA ?? false ,
138- inputs . extendedMode ?? false ,
139- inputs . usePacePolling ?? false ,
140- inputs . sessionId ,
141- ) ,
142- ) ;
112+ return await scanDocument ( {
113+ documentNumber : inputs . passportNumber ,
114+ dateOfBirth : inputs . dateOfBirth ,
115+ dateOfExpiry : inputs . dateOfExpiry ,
116+ canNumber : inputs . canNumber ?? '' ,
117+ useCan : inputs . useCan ?? false ,
118+ skipPACE : inputs . skipPACE ?? false ,
119+ skipCA : inputs . skipCA ?? false ,
120+ extendedMode : inputs . extendedMode ?? false ,
121+ usePacePolling : inputs . usePacePolling ?? false ,
122+ sessionId : inputs . sessionId ,
123+ } ) ;
143124} ;
144125
145126const handleResponseIOS = ( response : unknown ) => {
146- const parsed = JSON . parse ( String ( response ) ) ;
147- const dgHashesObj = JSON . parse ( parsed ?. dataGroupHashes ) ;
127+ // Response is already parsed as an object by the normalized scan function
128+ const parsed = response as Record < string , unknown > ;
129+ const dgHashesObj = JSON . parse ( String ( parsed ?. dataGroupHashes ?? '{}' ) ) ;
148130 const dg1HashString = dgHashesObj ?. DG1 ?. sodHash ;
149131 const dg1Hash = Array . from ( Buffer . from ( dg1HashString , 'hex' ) ) ;
150132 const dg2HashString = dgHashesObj ?. DG2 ?. sodHash ;
@@ -164,24 +146,29 @@ const handleResponseIOS = (response: unknown) => {
164146 // const _encapsulatedContentDigestAlgorithm =
165147 // parsed?.encapsulatedContentDigestAlgorithm;
166148 const documentSigningCertificate = parsed ?. documentSigningCertificate ;
167- const pem = JSON . parse ( documentSigningCertificate ) . PEM . replace ( / \n / g, '' ) ;
168- const eContentArray = Array . from ( Buffer . from ( signedAttributes , 'base64' ) ) ;
149+ const pem = JSON . parse ( String ( documentSigningCertificate ) ) . PEM . replace (
150+ / \n / g,
151+ '' ,
152+ ) ;
153+ const eContentArray = Array . from (
154+ Buffer . from ( String ( signedAttributes ) , 'base64' ) ,
155+ ) ;
169156 const signedEContentArray = eContentArray . map ( byte =>
170157 byte > 127 ? byte - 256 : byte ,
171158 ) ;
172159
173160 const concatenatedDataHashesArray = Array . from (
174- Buffer . from ( eContentBase64 , 'base64' ) ,
161+ Buffer . from ( String ( eContentBase64 ) , 'base64' ) ,
175162 ) ;
176163 const concatenatedDataHashesArraySigned = concatenatedDataHashesArray . map (
177164 byte => ( byte > 127 ? byte - 256 : byte ) ,
178165 ) ;
179166
180167 const encryptedDigestArray = Array . from (
181- Buffer . from ( signatureBase64 , 'base64' ) ,
168+ Buffer . from ( String ( signatureBase64 ) , 'base64' ) ,
182169 ) . map ( byte => ( byte > 127 ? byte - 256 : byte ) ) ;
183170
184- const document_type = mrz . length === 88 ? 'passport' : 'id_card' ;
171+ const document_type = String ( mrz ) . length === 88 ? 'passport' : 'id_card' ;
185172
186173 return {
187174 mrz,
0 commit comments