@sanctum-key/react-native-sdk 1.0.34 β 1.0.35
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/build/package.json +1 -1
- package/build/src/components/EnhancedCameraView.d.ts.map +1 -1
- package/build/src/components/EnhancedCameraView.js +58 -11
- package/build/src/components/EnhancedCameraView.js.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.js +3 -1
- package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
- package/build/src/modules/api/KYCService.d.ts +10 -11
- package/build/src/modules/api/KYCService.d.ts.map +1 -1
- package/build/src/modules/api/KYCService.js +170 -504
- package/build/src/modules/api/KYCService.js.map +1 -1
- package/package.json +1 -1
- package/src/components/EnhancedCameraView.tsx +66 -14
- package/src/components/KYCElements/IDCardCapture.tsx +4 -1
- package/src/modules/api/KYCService.ts +198 -704
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KYCService.js","sourceRoot":"","sources":["../../../../src/modules/api/KYCService.ts"],"names":[],"mappings":"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","sourcesContent":["import axios from 'axios';\nimport { GovernmentDocumentType, GovernmentDocumentTypeShorted, OrientationVideoResponse } from '../../types/KYC.types';\nimport { CheckTemplateTypeResponse } from '../../components/OverLay/type';\nimport { SessionResponse, VerificationSessionRequest } from './types';\nimport { KycEnvironment } from '../../types/env.types';\nimport { logger } from '../../utils/logger';\nimport { Platform } from 'react-native';\nimport KYCConfig from '../../config/KYCConfig';\n\nconst appendFileToFormData = async (formData: FormData, key: string, uri: string, name: string = 'file.jpg', type: string = 'image/jpeg') => {\n if (Platform.OS === 'web') {\n const response = await fetch(uri);\n const blob = await response.blob();\n formData.append(key, blob, name);\n } else {\n formData.append(key, { uri, type, name } as any);\n }\n};\n\nconst documentTypeMap: Record<string, string> = {\n passport: \"passport\",\n driversLicense: \"driving_licence\",\n healthInsuranceCard: \"health_insurance_card\",\n residencePermit: \"permanent_residence_card\",\n identityCard: \"identity_card\",\n nationalId: \"identity_card\", \n national_id: \"identity_card\", \n drivers_licence: \"driving_licence\", \n drivers_license: \"driving_licence\", \n driving_license: \"driving_licence\", \n permanent_residence: \"permanent_residence_card\", \n};\n\nlet cachedToken: string | null = null;\nlet tokenExpiryTime: number | null = null;\nlet activeAuthRequest: Promise<string> | null = null;\n\nexport interface KYCRequest {\n userId: string;\n documentImage: string;\n selfieImage: string;\n documentType: 'passport' | 'id_card' | 'drivers_license';\n}\n\nexport interface KYCResponse {\n success: boolean;\n verificationId: string;\n status: 'pending' | 'approved' | 'rejected';\n message?: string;\n}\n\nexport interface FaceDetectionRequest {\n selfieImage: string;\n documentImage: string;\n}\n\nexport interface FaceDetectionResponse {\n match: boolean;\n confidence: number;\n message: string;\n}\n\nexport interface SelfieVideoResponse {\n orientation_direction: \"center\" | \"left\" | \"right\",\n turn_score: number;\n bbox: number[];\n capture: boolean;\n instruction: string;\n error: string;\n}\n\nexport class KYCService {\n private baseURL: string;\n private apiKey: string;\n \n private faceServiceURL = 'https://face-infera.sanctumkey.com';\n private textExtractionServiceURL = 'https://text-infera.sanctumkey.com';\n private mrzServiceURL = 'https://mrz-infera.sanctumkey.com';\n private barcodeServiceURL = 'https://face-infera.sanctumkey.com';\n private orientationServiceURL = 'http://18.188.180.154:8080';\n\n constructor(baseURL: string, apiKey: string) {\n this.baseURL = baseURL;\n this.apiKey = apiKey;\n }\n\n private getHeaders() {\n return {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n };\n }\n\n async submitKYC(data: KYCRequest): Promise<KYCResponse> {\n try {\n const response = await axios.post(\n `${this.baseURL}/kyc/submit`,\n data,\n { headers: this.getHeaders() }\n );\n return response.data;\n } catch (error) {\n logger.error('Error submitting KYC:', error);\n throw error;\n }\n }\n\n async detectFace(data: FaceDetectionRequest): Promise<FaceDetectionResponse> {\n try {\n const response = await axios.post(\n `${this.baseURL}/ai/face-detection`,\n data,\n { headers: this.getHeaders() }\n );\n return response.data;\n } catch (error) {\n logger.error('Error detecting face:', error);\n throw error;\n }\n }\n\n async validateDocument(documentImage: string, documentType: string): Promise<any> {\n try {\n const response = await axios.post(\n `${this.baseURL}/ai/document-validation`,\n { documentImage, documentType },\n { headers: this.getHeaders() }\n );\n return response.data;\n } catch (error) {\n logger.error('Error validating document:', error);\n throw error;\n }\n }\n\n async getKYCStatus(verificationId: string): Promise<KYCResponse> {\n try {\n const response = await axios.get(\n `${this.baseURL}/kyc/status/${verificationId}`,\n { headers: this.getHeaders() }\n );\n return response.data;\n } catch (error) {\n logger.error('Error getting KYC status:', error);\n throw error;\n }\n }\n\n async processSelfieOrientationPicture(videoFile: string, token: string): Promise<SelfieVideoResponse[]> {\n try {\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', videoFile, 'selfie_picture.jpg', 'image/jpeg');\n\n const response = await axios.post<SelfieVideoResponse[]>(\n `${this.faceServiceURL}/detect_face_orientation/`,\n formData,\n {\n timeout: 20000,\n headers: {\n // π¨ Removed explicit Content-Type to allow boundary injection\n 'Authorization': `Bearer ${token}`,\n },\n }\n );\n return response.data;\n } catch (error) {\n logger.error('Error processing selfie orientation:', error);\n throw error;\n }\n }\n\n async processOrientationVideo(videoFile: string, env: KycEnvironment = 'PRODUCTION'): Promise<OrientationVideoResponse> {\n try {\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI orientation video processing\");\n logger.log(\"SANDBOX mode: Returning mock orientation video response\");\n return {\n success: true,\n data: {\n center: { captured: true, frame: 10 },\n left: { captured: true, frame: 30 },\n right: { captured: true, frame: 50 }\n },\n message: 'SANDBOX: Orientation video processed successfully (mocked)'\n };\n }\n\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', videoFile, 'orientation_video.mp4', 'video/mp4');\n\n const response = await axios.post(\n `${this.orientationServiceURL}/process_orientation_video_stream/`,\n formData,\n {\n // Let axios set the proper multipart boundary header automatically\n timeout: 90000,\n }\n );\n\n return {\n success: true,\n data: response.data,\n message: 'Orientation video processed successfully'\n };\n } catch (error: any) {\n logger.error('Error processing orientation video:', JSON.stringify(error, null, 2));\n if (error.response?.status === 503) {\n return {\n success: false,\n error: {\n code: 'SERVICE_UNAVAILABLE',\n message: 'Service not ready, model not initialized.',\n details: error.response.data\n },\n message: 'Service temporarily unavailable'\n };\n }\n return {\n success: false,\n error: {\n code: 'PROCESSING_ERROR',\n message: error.response?.data?.detail || error.message || 'Unknown error occurred',\n details: error.response?.data\n },\n message: 'Failed to process orientation video'\n };\n }\n }\n\n // STEP 1 - ID CARD VALIDATION\n async detectFaceOnId(\n idCardImageUri: string,\n token: string,\n docType: string,\n env: KycEnvironment = 'PRODUCTION'\n ): Promise<{ result: boolean; detail: any[]; card_obb?: any }> {\n if (env === 'SANDBOX') {\n logger.log(\"SANDBOX mode: Returning mock face detection response\");\n return {\n result: true,\n detail: [{ confidence: 0.95, bbox: [50, 50, 200, 200] }],\n card_obb: { x: 50, y: 50, width: 200, height: 200 }\n };\n }\n\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', idCardImageUri, 'id_card_photo.jpg', 'image/jpeg');\n\n const docTypeShorted = GovernmentDocumentTypeShorted[docType as GovernmentDocumentType] || docType;\n logger.log('detectFaceOnId Request:', { docTypeShorted, imageUri: idCardImageUri });\n\n try {\n const res = await axios.post(\n `${this.faceServiceURL}/detect_face/?doc_type=${docTypeShorted}`,\n formData,\n {\n headers: {\n // π¨ Removed explicit Content-Type to allow boundary injection\n 'Authorization': `Bearer ${token}`\n },\n timeout: 20000 \n }\n );\n \n logger.log('detectFaceOnId res', JSON.stringify(res.data, null, 2));\n\n if (res.data?.result) {\n return res.data;\n }\n throw new Error(res.data?.detail || 'detect_face failed');\n } catch (error: any) {\n const safeError = errorMessage(error) || error.message;\n logger.error('Error detecting face on id:', safeError);\n throw error;\n }\n }\n\n //check templatetemplate_type\n async checkTemplateType(\n params: {\n fileUri: string;\n docType: string;\n docRegion: string;\n token: string;\n postfix: string;\n issuingSubdivision?: string;\n },\n env: KycEnvironment = 'PRODUCTION'\n ): Promise<any> {\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI template type check\");\n logger.log(\"SANDBOX mode: Returning mock template type response\");\n const { docType, docRegion, postfix } = params;\n return {\n template_path: `templates/${docType}_${docRegion}_${postfix}.jpg`,\n card_obb: { x: 50, y: 50, width: 200, height: 200 }\n };\n }\n\n const { fileUri, docType, docRegion, token, postfix, issuingSubdivision } = params;\n\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', fileUri, `id_card_${postfix}.jpg`, 'image/jpeg');\n\n const docTypeShorted = GovernmentDocumentTypeShorted[docType as GovernmentDocumentType];\n \n let url = `${this.mrzServiceURL}/get_template_version/?doc_type=${encodeURIComponent(docTypeShorted)}&doc_region=${encodeURIComponent(docRegion)}&postfix=${postfix}`;\n if (issuingSubdivision) {\n url += `&issuing_subdivision=${encodeURIComponent(issuingSubdivision)}`;\n }\n\n logger.log('checkTemplateType params', this.mrzServiceURL, JSON.stringify({ fileUri, docTypeShorted, docRegion, issuingSubdivision, token, postfix, url }, null, 2));\n\n try {\n const res = await axios.post<CheckTemplateTypeResponse>(url, formData, {\n headers: {\n // π¨ Removed explicit Content-Type to allow boundary injection\n 'Authorization': `Bearer ${token}`,\n },\n timeout: 60000,\n });\n\n logger.log('checkTemplateType res', JSON.stringify(res.data, null, 2));\n return res.data;\n } catch (e: any) {\n logger.error('Error checking template type:', JSON.stringify(e));\n throw e;\n }\n }\n\n async extractDocumentInformation(params: {\n fileUri: string;\n docType: string;\n docRegion: string;\n templatePath: string;\n issuingSubdivision?: string;\n token: string;\n postfix?: string\n }): Promise<any> {\n const { fileUri, docType, docRegion, templatePath, issuingSubdivision, token, postfix = 'front' } = params;\n\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', fileUri, `id_card_${postfix}.jpg`, 'image/jpeg');\n\n let queryParams = `doc_type=${encodeURIComponent(docType)}&doc_region=${encodeURIComponent(docRegion)}&template_path=${encodeURIComponent(templatePath)}&postfix=${postfix}&cleaned=true`;\n if (issuingSubdivision) {\n queryParams += `&issuing_subdivision=${encodeURIComponent(issuingSubdivision)}`;\n }\n\n logger.log(`URL PARAMS: ${queryParams}`)\n const url = `${this.textExtractionServiceURL}/extract_doc_information/?${queryParams}`;\n\n try {\n const startRes = await axios.post(url, formData, {\n headers: {\n // π¨ Removed explicit Content-Type to allow boundary injection\n 'Authorization': `Bearer ${token}`\n },\n timeout: 60000,\n });\n\n const jobId = startRes.data?.job_id;\n if (!jobId) throw new Error(\"Backend did not return a job_id\");\n logger.log(`Extraction job started: ${jobId}. Polling for results...`);\n\n const statusUrl = `${this.textExtractionServiceURL}/extract_doc_information/status/${jobId}`;\n const maxRetries = 15;\n\n for (let i = 0; i < maxRetries; i++) {\n await new Promise(resolve => setTimeout(resolve, 2000));\n const statusRes = await axios.get(statusUrl, {\n headers: {\n 'Authorization': `Bearer ${token}`\n }\n });\n const statusData = statusRes.data;\n\n if (statusData.status === 'completed') {\n logger.log('Extraction completed successfully', JSON.stringify(truncateFields(statusData.result)));\n return statusData.result;\n }\n if (statusData.status === 'failed') {\n throw new Error(statusData.error || \"Document extraction failed during processing.\");\n }\n }\n throw new Error(\"Document extraction timed out waiting for results.\");\n } catch (e: any) {\n const errorMsg = e.response?.data?.detail || e.message;\n logger.error('Error extracting document information:', errorMsg);\n throw new Error(errorMsg);\n }\n }\n\n async extractBarcode(params: { fileUri: string; token: string; docType: string; postfix?: string }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI barcode extraction\");\n logger.log(\"SANDBOX mode: Returning mock barcode response\");\n return { barcode_data: 'SANDBOX_MOCK_BARCODE_DATA', card_obb: { x: 50, y: 50, width: 200, height: 200 } };\n }\n\n const { fileUri, token, docType, postfix = 'back' } = params;\n logger.log(docType)\n \n const formData = new FormData();\n await appendFileToFormData(formData, 'file', fileUri, `id_${postfix}_photo.jpg`, 'image/jpeg');\n\n const url = `${this.barcodeServiceURL}/decode_barcode/?doc_type=${encodeURIComponent(docType)}`;\n\n const attempt = async () => {\n try {\n const res = await axios.post(url, formData, {\n headers: {\n // π¨ Removed explicit Content-Type to allow boundary injection\n 'Authorization': `Bearer ${token}`\n },\n timeout: 60000,\n });\n logger.log('π¦ Raw extractBarcode response:', JSON.stringify(res.data, null, 2));\n return res.data;\n } catch (e: any) {\n throw new Error(e?.message || 'Erreur de dΓ©tection du code-barres');\n }\n };\n\n try {\n return await attempt();\n } catch (e) {\n logger.error('β Error extracting Barcode text:', JSON.stringify(e));\n throw e;\n }\n }\n\n async formatBarcodeData(params: { textInput: string; token: string }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI barcode formatting\");\n logger.log(\"SANDBOX mode: Returning mock formatted barcode response\");\n return { barcode_type: \"SANDBOX_MOCK\", first_name: \"JOHN\", last_name: \"DOE\", card_number: \"000000000000\" };\n }\n\n const { textInput, token } = params;\n \n // URLSearchParams requires urlencoded, this remains untouched\n const formData = new URLSearchParams();\n formData.append('text_input', textInput);\n\n const url = `${this.barcodeServiceURL}/format_barcode_data/`;\n\n const attempt = async () => {\n try {\n const res = await axios.post(url, formData.toString(), {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': `Bearer ${token}`\n },\n timeout: 60000,\n });\n logger.log('π¦ Raw formatBarcodeData response:', JSON.stringify(res.data, null, 2));\n return res.data;\n } catch (e: any) {\n throw new Error(e?.message || 'Erreur de formatage du code-barres');\n }\n };\n\n try {\n return await attempt();\n } catch (e) {\n logger.error('β Error formatting Barcode text:', JSON.stringify(e));\n throw e;\n }\n }\n\n async extractMrzText(\n params: {\n fileUri: string;\n docType: string;\n docRegion: string;\n postfix?: string;\n token: string;\n template_path: string;\n mrz_type?: string;\n },\n env: KycEnvironment = 'PRODUCTION'\n ): Promise<any> {\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI MRZ extraction\");\n const { docType, docRegion, postfix = 'back', mrz_type } = params;\n return {\n success: true,\n parsed_data: {\n status: 'success',\n document_type: docType,\n mrz_type: mrz_type || 'TD1',\n doc_region: docRegion,\n postfix: postfix\n },\n card_obb: { x: 50, y: 50, width: 200, height: 200 }\n };\n }\n\n const { fileUri, docType, docRegion, postfix = 'back', token, template_path, mrz_type } = params;\n\n const docTypeShorted = GovernmentDocumentTypeShorted[docType as GovernmentDocumentType] || docType;\n const safeMrzType = mrz_type && mrz_type.trim() !== '' ? mrz_type : 'TD1';\n\n logger.log(\"docTypeShorted\", docTypeShorted, docRegion, postfix);\n\n const queryParams = new URLSearchParams({\n doc_type: docTypeShorted,\n doc_region: docRegion,\n postfix: postfix,\n template_path: template_path,\n mrz_type: safeMrzType,\n reset_cache: 'true'\n }).toString();\n\n const url = `${this.mrzServiceURL}/extract_mrz_text/?${queryParams}`;\n logger.log(\"url\", url);\n\n try {\n let response;\n\n if (Platform.OS === 'web') {\n const nativeFetch = window.fetch;\n const NativeFormData = window.FormData;\n const formData = new NativeFormData();\n const fileReq = await nativeFetch(fileUri);\n const blob = await fileReq.blob();\n formData.append('file', blob, `id_card_${postfix}.jpg`);\n\n response = await nativeFetch(url, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/json'\n },\n body: formData,\n });\n } else {\n // π± NATIVE FETCH APPROACH (Untouched, robust as is)\n const formData = new FormData();\n const filePayload = {\n uri: fileUri,\n type: 'image/jpeg',\n name: `id_card_${postfix}.jpg`,\n };\n formData.append('file', filePayload as any);\n\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'application/json'\n },\n body: formData,\n });\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n logger.error('Backend MRZ Error Details:', errorText);\n throw new Error(`Erreur serveur: ${response.status}`);\n }\n const data = await response.json();\n logger.log('extractMrzText res', JSON.stringify(data, null, 2));\n\n if (Object.keys(data).length === 0) throw new Error('No data found');\n if (data?.success === false) {\n const serverMessage = data.parsed_data?.status_message || data.parsed_data?.status || 'Γchec de l\\'extraction MRZ';\n throw new Error(`Lecture MRZ refusΓ©e: ${serverMessage}`);\n }\n return data;\n } catch (error: any) {\n logger.error(\"MRZ Fetch Error: \", error?.message || error);\n throw new Error(error?.message || 'Erreur de connexion lors de l\\'extraction MRZ');\n }\n }\n\n // STEP 2 - SELFIE VALIDATION\n async recognizeFace(params: { idPhotoUri: string; selfiePhotoUri: string }, env: KycEnvironment = 'PRODUCTION'): Promise<{ is_match: boolean; similarity: number; id_bbox?: number[]; selfie_bbox?: number[] }> {\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI face recognition\");\n logger.log(\"SANDBOX mode: Returning mock face recognition response\");\n return { is_match: true, similarity: 0.95, id_bbox: [50, 50, 200, 200], selfie_bbox: [50, 50, 200, 200] };\n }\n\n const { idPhotoUri, selfiePhotoUri } = params;\n const formData = new FormData();\n await appendFileToFormData(formData, 'id_photo', idPhotoUri, 'id_card_photo.jpg', 'image/jpeg');\n await appendFileToFormData(formData, 'selfie_photo', selfiePhotoUri, 'selfie_final.jpg', 'image/jpeg');\n\n const res = await axios.post(`${this.faceServiceURL}/recognize_face/`, formData, { \n // Let Axios determine Content-Type boundary natively\n timeout: 45000 \n });\n\n if (res.data?.detail) throw new Error(res.data.detail);\n return res.data;\n }\n\n // HEALTH CHECKS\n async healthFaceDetection(): Promise<any> {\n const res = await axios.get(`${this.faceServiceURL}/health`);\n return res.data;\n }\n\n async healthTextExtraction(): Promise<any> {\n const res = await axios.get(`${this.textExtractionServiceURL}/health`);\n return res.data;\n }\n\n async healthMrzService(): Promise<any> {\n const res = await axios.get(`${this.mrzServiceURL}/health`);\n return res.data;\n }\n\n async healthOrientationService(): Promise<any> {\n const res = await axios.get(`${this.orientationServiceURL}/health`);\n return res.data;\n }\n\n async newSession({ token, apiKey }: { token?: string, apiKey?: string }): Promise<SessionResponse> {\n try {\n const data = {\n \"status\": \"PENDING\",\n \"metadata\": {},\n }\n const res = await axios.post<SessionResponse>(`${KYCConfig.getBackendUrl()}/verification/sessions/`, data, {\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'Authorization': `ApiKey ${apiKey}` } : { 'Authorization': `Bearer ${token}` })\n }\n });\n return res.data;\n } catch (error: any) {\n logger.error('Error creating session:', JSON.stringify(errorMessage(error), null, 2));\n const backendMessage = errorMessage(error);\n if (backendMessage) {\n logger.error('Backend error message:', JSON.stringify(truncateFields(backendMessage), null, 2));\n throw new Error(`Backend error: ${JSON.stringify(truncateFields(backendMessage))}`);\n }\n throw error;\n }\n }\n\n async verificationSession(payload: VerificationSessionRequest): Promise<any> {\n try {\n const { session_id, step, data, templateId, action, apiKey } = payload;\n const token = apiKey ? undefined : await authentification();\n if (!apiKey && !token) {\n throw new Error(\"Authentication failed: No API key or Token available.\");\n }\n \n const normalizedData = { ...data };\n logger.log(\"π [DocType Check] Raw incoming data.metadata.document_type:\", normalizedData?.metadata?.document_type);\n logger.log(\"π [DocType Check] Raw incoming data.documentType:\", normalizedData?.documentType);\n \n const rawDocType = normalizedData?.metadata?.document_type || normalizedData?.documentType || normalizedData?.documents?.documentType;\n \n if (rawDocType) {\n const originalDocType = rawDocType;\n const mappedDocType = documentTypeMap[originalDocType] ?? originalDocType;\n normalizedData.metadata = {\n ...normalizedData.metadata,\n document_type: mappedDocType,\n };\n normalizedData.documentType = mappedDocType;\n if (normalizedData.documents) {\n normalizedData.documents = { ...normalizedData.documents, documentType: mappedDocType };\n const isSingleSided = ['passport', 'visa'].includes(mappedDocType.toLowerCase());\n if (isSingleSided && !normalizedData.documents.back) {\n normalizedData.documents.back = {};\n }\n if (normalizedData.documents.front?.mrz && typeof normalizedData.documents.front.mrz === 'string') {\n try {\n normalizedData.documents.front = { ...normalizedData.documents.front, mrz: JSON.parse(normalizedData.documents.front.mrz) };\n } catch (e) {\n logger.log(\"Warning: Could not parse front MRZ JSON\");\n }\n }\n if (normalizedData.documents.back?.mrz && typeof normalizedData.documents.back.mrz === 'string') {\n try {\n normalizedData.documents.back = { ...normalizedData.documents.back, mrz: JSON.parse(normalizedData.documents.back.mrz) };\n } catch (e) {\n logger.log(\"Warning: Could not parse back MRZ JSON\");\n }\n }\n }\n }\n\n const payloadData = {\n action,\n data: {\n ...normalizedData,\n step,\n templateId,\n },\n session_id,\n timestamp: new Date().toISOString(),\n };\n const url = `${KYCConfig.getBackendUrl()}/verification/api/kyc/sessions/${session_id}/steps/${step}/`;\n const logPayload = truncateFields({ payloadData, session_id, step });\n \n logger.log(\n \"verificationSession payload\",\n JSON.stringify(\n {\n url,\n apiKey: apiKey ? \"***HIDDEN***\" : \"None\",\n token: token ? \"***HIDDEN***\" : \"None\",\n payload: logPayload,\n },\n null,\n 2\n )\n );\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(apiKey ? { Authorization: `ApiKey ${apiKey}` } : {}),\n ...(token && !apiKey ? { Authorization: `Bearer ${token}` } : {})\n };\n\n const res = await axios.post<SessionResponse>(url, payloadData, { headers });\n \n logger.log(\n \"verificationSession res\",\n JSON.stringify(truncateFields(res.data), null, 2)\n );\n return res.data;\n } catch (error: any) {\n const parsedError = errorMessage(error);\n const finalErrorMessage = parsedError || error?.message || \"Unknown validation error\";\n logger.error(\n \"Error validating component:\",\n JSON.stringify(finalErrorMessage, null, 2)\n );\n throw new Error(typeof finalErrorMessage === 'string' ? finalErrorMessage : JSON.stringify(finalErrorMessage));\n }\n }\n\n async sendEmailVerificationCode(email: string, auth?: { apiKey?: string; token?: string }): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/email/send/`;\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const res = await axios.post(\n url,\n { email },\n {\n headers: {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n },\n }\n );\n return res.data;\n }\n\n async verifyEmailCode(otp: string, auth?: { apiKey?: string; token?: string }): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/email/verify/`;\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const res = await axios.post(\n url,\n { otp },\n {\n headers: {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n },\n }\n );\n return res.data;\n }\n\n async getVerificationResult(session_id: string, apiKey?: string): Promise<any> {\n try {\n const token = apiKey ? undefined : await authentification();\n const url = `${KYCConfig.getBackendUrl()}/verification/api/kyc/result/?session_id=${session_id}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n logger.log(\"β³ 8 seconds passed. Force-killing hanging Axios request...\");\n controller.abort();\n }, 8000);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (apiKey) {\n headers[\"Authorization\"] = `ApiKey ${apiKey}`;\n } else if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n logger.log(\"3. Firing Axios GET to:\", url);\n \n const res = await axios.get(url, { headers, signal: controller.signal });\n clearTimeout(timeoutId);\n \n return res.data;\n } catch (error: any) {\n if (axios.isCancel(error) || error.name === 'AbortError' || error.name === 'CanceledError') {\n logger.error('Axios request was forcefully aborted due to timeout');\n throw new Error('Timeout exceeded');\n }\n logger.error('Error getting verification result:', JSON.stringify(errorMessage(error) || error.message, null, 2));\n throw error;\n }\n }\n\n async sendWhatsAppVerificationCode(\n sessionId: string,\n phoneNumber: string,\n auth?: { apiKey?: string; token?: string }\n ): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/send-whatsapp-verification/`;\n const formattedPhoneNumber = phoneNumber.replace(/^\\+/, '');\n const payload = { session_id: sessionId, phone_number: formattedPhoneNumber };\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n \n const headers = {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n };\n try {\n const res = await axios.post(url, payload, { headers });\n logger.log(\"β
WhatsApp Send Success:\", res.data);\n return res.data;\n } catch (error: any) {\n if (error.response) {\n logger.error(\"π WhatsApp Send Failed (Server Response):\", {\n status: error.response.status,\n data: error.response.data,\n headers: error.response.headers\n });\n }\n throw error;\n }\n }\n\n async verifyWhatsAppCode(\n sessionId: string,\n otp: string,\n phoneNumber: string,\n auth?: { apiKey?: string; token?: string }\n ): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/verify-whatsapp-code/`;\n const formattedPhoneNumber = phoneNumber.replace(/^\\+/, '');\n const payload = { session_id: sessionId, verification_code: otp, phone_number: formattedPhoneNumber };\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n \n const headers = {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n };\n try {\n const res = await axios.post(url, payload, { headers });\n return res.data;\n } catch (error: any) {\n if (error.response) {\n logger.error(\"π WhatsApp Verification Failed (Server Response):\", {\n status: error.response.status,\n data: error.response.data,\n headers: error.response.headers\n });\n }\n throw error;\n }\n }\n\n async validateBackTemplate(params: {\n region: string;\n docType: string;\n frontTemplateName: string;\n backTemplateName: string;\n subRegion: string;\n token: string;\n }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n if (env === 'SANDBOX') {\n logger.log(\"SANDBOX mode: Skipping back template validation\");\n return { is_match: true, status_message: \"SANDBOX: Valid Match\" };\n }\n const { region, docType, frontTemplateName, backTemplateName, subRegion, token } = params;\n const queryParams = new URLSearchParams({\n region: region,\n doc_type: docType,\n front_template_name: frontTemplateName,\n back_template_name: backTemplateName,\n sub_region: subRegion || \"\"\n }).toString();\n const url = `${this.mrzServiceURL}/validate_back_template/?${queryParams}`;\n logger.log('validateBackTemplate URL', url);\n \n try {\n const res = await axios.post(url, null, {\n headers: {\n 'Accept': 'application/json',\n 'Authorization': `Bearer ${token}`\n },\n timeout: 20000,\n });\n logger.log('validateBackTemplate res', JSON.stringify(res.data, null, 2));\n return res.data;\n } catch (e: any) {\n const errorMsg = e.response?.data?.detail || e.response?.data?.Error || e.message;\n logger.error('Error validating back template:', JSON.stringify(errorMsg));\n throw new Error(typeof errorMsg === 'string' ? errorMsg : 'Template validation failed');\n }\n }\n\n async generateReferralCode(\n payload: { session_id: string; [key: string]: any },\n apiKey: string\n ): Promise<any> {\n try {\n logger.log(`Generating referral code for session: ${payload.session_id}`);\n if (!apiKey) {\n throw new Error(\"Authentication failed: API key is required.\");\n }\n const url = `${KYCConfig.getBackendUrl()}/core/referral-code/generate/`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `ApiKey ${apiKey}`\n };\n \n const res = await axios.post(url, payload, { headers, timeout: 8000 });\n logger.log(\"generateReferralCode SUCCESS:\", JSON.stringify(res.data, null, 2));\n return res.data;\n } catch (error: any) {\n const parsedError = errorMessage(error);\n const finalErrorMessage = parsedError || error?.message || \"Failed to generate referral code\";\n logger.error(\"Error generating referral code:\", typeof finalErrorMessage === 'string' ? finalErrorMessage : JSON.stringify(finalErrorMessage));\n throw new Error(typeof finalErrorMessage === 'string' ? finalErrorMessage : JSON.stringify(finalErrorMessage));\n }\n }\n}\n\nconst kycService = new KYCService(\"\", \"\");\nexport default kycService;\n\nexport function truncateFields(obj: any, maxLength = 420): any {\n if (typeof obj !== 'object' || obj === null) return obj;\n if (Array.isArray(obj)) return obj.map(item => truncateFields(item, maxLength));\n const truncated: any = {};\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n const value = obj[key];\n if (typeof value === 'string' && value.length > maxLength) {\n truncated[key] = value.slice(0, maxLength) + '... [truncated]';\n } else if (typeof value === 'object' && value !== null) {\n truncated[key] = truncateFields(value, maxLength);\n } else {\n truncated[key] = value;\n }\n }\n return truncated;\n}\n\nexport const authentification = async (): Promise<string> => {\n try {\n if (cachedToken && tokenExpiryTime && Date.now() < tokenExpiryTime - 10000) {\n return cachedToken;\n }\n if (activeAuthRequest) {\n return activeAuthRequest;\n }\n \n activeAuthRequest = (async () => {\n logger.log('Authenticating: Fetching new Keycloak token...');\n const params = 'client_id=kyc_frontend&client_secret=QhgAmvKgmwODzsEp98dnA4PeUEMMaFHd&grant_type=client_credentials';\n const res = await axios.post(\n `https://idms.sanctumkey.com/realms/kyc/protocol/openid-connect/token`,\n params,\n {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n }\n );\n cachedToken = res.data.access_token;\n if (!cachedToken) {\n throw new Error(\"Keycloak returned a success response but no access_token was found.\");\n }\n const expiresInMs = (res.data.expires_in || 300) * 1000;\n tokenExpiryTime = Date.now() + expiresInMs;\n return cachedToken;\n })();\n \n const finalToken = await activeAuthRequest;\n return finalToken;\n } catch (error: any) {\n cachedToken = null;\n const safeErrorMessage = error?.response?.data?.error_description || error?.response?.data?.error || error?.message || 'Unknown network error';\n logger.error('Error authentifying:', safeErrorMessage);\n throw new Error(`Γchec de l'authentification: ${safeErrorMessage}`);\n } finally {\n activeAuthRequest = null;\n }\n}\n\nexport const errorMessage = (error: any) => {\n return error.response?.data?.message || error.response?.data?.detail || error.response?.data?.error || error.response?.data;\n}"]}
|
|
1
|
+
{"version":3,"file":"KYCService.js","sourceRoot":"","sources":["../../../../src/modules/api/KYCService.ts"],"names":[],"mappings":"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","sourcesContent":["import axios from 'axios';\nimport { GovernmentDocumentType, GovernmentDocumentTypeShorted, OrientationVideoResponse } from '../../types/KYC.types';\nimport { CheckTemplateTypeResponse } from '../../components/OverLay/type';\nimport { SessionResponse, VerificationSessionRequest } from './types';\nimport { KycEnvironment } from '../../types/env.types';\nimport { logger } from '../../utils/logger';\nimport { Platform } from 'react-native';\nimport KYCConfig from '../../config/KYCConfig';\n\nconst appendFileToFormData = async (formData: FormData, key: string, uri: string, name: string = 'file.jpg', type: string = 'image/jpeg') => {\n if (Platform.OS === 'web') {\n const response = await fetch(uri);\n const blob = await response.blob();\n formData.append(key, blob, name);\n } else {\n // React Native Native structure\n formData.append(key, { uri, type, name } as any);\n }\n};\n\nconst documentTypeMap: Record<string, string> = {\n passport: \"passport\",\n driversLicense: \"driving_licence\",\n healthInsuranceCard: \"health_insurance_card\",\n residencePermit: \"permanent_residence_card\",\n identityCard: \"identity_card\",\n nationalId: \"identity_card\",\n national_id: \"identity_card\",\n drivers_licence: \"driving_licence\",\n drivers_license: \"driving_licence\",\n driving_license: \"driving_licence\",\n permanent_residence: \"permanent_residence_card\",\n};\n\nlet cachedToken: string | null = null;\nlet tokenExpiryTime: number | null = null;\nlet activeAuthRequest: Promise<string> | null = null;\n\nexport interface KYCRequest { userId: string; documentImage: string; selfieImage: string; documentType: 'passport' | 'id_card' | 'drivers_license'; }\nexport interface KYCResponse { success: boolean; verificationId: string; status: 'pending' | 'approved' | 'rejected'; message?: string; }\nexport interface FaceDetectionRequest { selfieImage: string; documentImage: string; }\nexport interface FaceDetectionResponse { match: boolean; confidence: number; message: string; }\nexport interface SelfieVideoResponse { orientation_direction: \"center\" | \"left\" | \"right\", turn_score: number; bbox: number[]; capture: boolean; instruction: string; error: string; }\n\nexport class KYCService {\n private baseURL: string;\n private apiKey: string;\n private faceServiceURL = 'https://face-infera.sanctumkey.com';\n private textExtractionServiceURL = 'https://text-infera.sanctumkey.com';\n private mrzServiceURL = 'https://mrz-infera.sanctumkey.com';\n private barcodeServiceURL = 'https://face-infera.sanctumkey.com';\n private orientationServiceURL = 'http://18.188.180.154:8080';\n\n constructor(baseURL: string, apiKey: string) {\n this.baseURL = baseURL;\n this.apiKey = apiKey;\n }\n\n private getHeaders() {\n return {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n };\n }\n\n // π¨ BULLETPROOF MULTIPART FETCHER\n // Replaces Axios for file uploads to guarantee iOS compatibility\n private async crossPlatformMultipartUpload<T>(url: string, formData: FormData, token?: string, timeoutMs: number = 60000): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n const headers: Record<string, string> = {\n 'Accept': 'application/json',\n };\n if (token) headers['Authorization'] = `Bearer ${token}`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers, // Do NOT set Content-Type, native fetch sets the boundary\n body: formData,\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n const responseText = await response.text();\n let responseData;\n try {\n responseData = responseText ? JSON.parse(responseText) : {};\n } catch (e) {\n responseData = { detail: responseText };\n }\n\n if (!response.ok) {\n // Mock Axios error structure so your `errorMessage` helper still works!\n throw { response: { status: response.status, data: responseData } };\n }\n\n return responseData as T;\n } catch (error: any) {\n clearTimeout(timeoutId);\n if (error.name === 'AbortError') {\n throw { response: { data: { message: 'Request timed out' } } };\n }\n throw error;\n }\n }\n\n async submitKYC(data: KYCRequest): Promise<KYCResponse> {\n try {\n const response = await axios.post(`${this.baseURL}/kyc/submit`, data, { headers: this.getHeaders() });\n return response.data;\n } catch (error) { throw error; }\n }\n\n async detectFace(data: FaceDetectionRequest): Promise<FaceDetectionResponse> {\n try {\n const response = await axios.post(`${this.baseURL}/ai/face-detection`, data, { headers: this.getHeaders() });\n return response.data;\n } catch (error) { throw error; }\n }\n\n async processSelfieOrientationPicture(videoFile: string, token: string): Promise<SelfieVideoResponse[]> {\n try {\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', videoFile, 'selfie_picture.jpg', 'image/jpeg');\n \n const data = await this.crossPlatformMultipartUpload<SelfieVideoResponse[]>(\n `${this.faceServiceURL}/detect_face_orientation/`, formData, token, 20000\n );\n return data;\n } catch (error) { throw error; }\n }\n\n async processOrientationVideo(videoFile: string, env: KycEnvironment = 'PRODUCTION'): Promise<OrientationVideoResponse> {\n try {\n if (env === 'SANDBOX') {\n return { success: true, data: { center: { captured: true, frame: 10 }, left: { captured: true, frame: 30 }, right: { captured: true, frame: 50 } }, message: 'SANDBOX Mock' };\n }\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', videoFile, 'orientation_video.mp4', 'video/mp4');\n \n const data = await this.crossPlatformMultipartUpload<any>(\n `${this.orientationServiceURL}/process_orientation_video_stream/`, formData, undefined, 90000\n );\n \n return { success: true, data: data, message: 'Orientation video processed successfully' };\n } catch (error: any) {\n if (error.response?.status === 503) {\n return { success: false, error: { code: 'SERVICE_UNAVAILABLE', message: 'Service not ready', details: error.response.data }, message: 'Service temporarily unavailable' };\n }\n return { success: false, error: { code: 'PROCESSING_ERROR', message: error.response?.data?.detail || 'Unknown error occurred' }, message: 'Failed to process orientation video' };\n }\n }\n\n async detectFaceOnId(idCardImageUri: string, token: string, docType: string, env: KycEnvironment = 'PRODUCTION'): Promise<{ result: boolean; detail: any[]; card_obb?: any }> {\n if (env === 'SANDBOX') {\n return { result: true, detail: [{ confidence: 0.95, bbox: [50, 50, 200, 200] }], card_obb: { x: 50, y: 50, width: 200, height: 200 } };\n }\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', idCardImageUri, 'id_card_photo.jpg', 'image/jpeg');\n const docTypeShorted = GovernmentDocumentTypeShorted[docType as GovernmentDocumentType] || docType;\n \n try {\n const data = await this.crossPlatformMultipartUpload<any>(\n `${this.faceServiceURL}/detect_face/?doc_type=${docTypeShorted}`, formData, token, 20000\n );\n if (data?.result) return data;\n throw new Error(data?.detail || 'detect_face failed');\n } catch (error: any) {\n throw error;\n }\n }\n\n async checkTemplateType(params: { fileUri: string; docType: string; docRegion: string; token: string; postfix: string; issuingSubdivision?: string; }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n if (env === 'SANDBOX') {\n return { template_path: `templates/${params.docType}_${params.docRegion}_${params.postfix}.jpg`, card_obb: { x: 50, y: 50, width: 200, height: 200 } };\n }\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', params.fileUri, `id_card_${params.postfix}.jpg`, 'image/jpeg');\n const docTypeShorted = GovernmentDocumentTypeShorted[params.docType as GovernmentDocumentType];\n \n let url = `${this.mrzServiceURL}/get_template_version/?doc_type=${encodeURIComponent(docTypeShorted)}&doc_region=${encodeURIComponent(params.docRegion)}&postfix=${params.postfix}`;\n if (params.issuingSubdivision) url += `&issuing_subdivision=${encodeURIComponent(params.issuingSubdivision)}`;\n \n try {\n return await this.crossPlatformMultipartUpload<CheckTemplateTypeResponse>(url, formData, params.token, 60000);\n } catch (e: any) { throw e; }\n }\n\n async extractDocumentInformation(params: { fileUri: string; docType: string; docRegion: string; templatePath: string; issuingSubdivision?: string; token: string; postfix?: string }): Promise<any> {\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', params.fileUri, `id_card_${params.postfix || 'front'}.jpg`, 'image/jpeg');\n \n let queryParams = `doc_type=${encodeURIComponent(params.docType)}&doc_region=${encodeURIComponent(params.docRegion)}&template_path=${encodeURIComponent(params.templatePath)}&postfix=${params.postfix || 'front'}&cleaned=true`;\n if (params.issuingSubdivision) queryParams += `&issuing_subdivision=${encodeURIComponent(params.issuingSubdivision)}`;\n \n const url = `${this.textExtractionServiceURL}/extract_doc_information/?${queryParams}`;\n try {\n const startResData = await this.crossPlatformMultipartUpload<any>(url, formData, params.token, 60000);\n const jobId = startResData?.job_id;\n if (!jobId) throw new Error(\"Backend did not return a job_id\");\n\n const statusUrl = `${this.textExtractionServiceURL}/extract_doc_information/status/${jobId}`;\n for (let i = 0; i < 15; i++) {\n await new Promise(resolve => setTimeout(resolve, 2000));\n // Status polling can remain Axios as it contains no file uploads\n const statusRes = await axios.get(statusUrl, { headers: { 'Authorization': `Bearer ${params.token}` } });\n if (statusRes.data.status === 'completed') return statusRes.data.result;\n if (statusRes.data.status === 'failed') throw new Error(statusRes.data.error || \"Document extraction failed.\");\n }\n throw new Error(\"Document extraction timed out waiting for results.\");\n } catch (e: any) { throw e; }\n }\n\n async extractBarcode(params: { fileUri: string; token: string; docType: string; postfix?: string }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n if (env === 'SANDBOX') return { barcode_data: 'SANDBOX_MOCK_BARCODE_DATA' };\n \n const formData = new FormData();\n await appendFileToFormData(formData, 'file', params.fileUri, `id_${params.postfix || 'back'}_photo.jpg`, 'image/jpeg');\n const url = `${this.barcodeServiceURL}/decode_barcode/?doc_type=${encodeURIComponent(params.docType)}`;\n \n try {\n return await this.crossPlatformMultipartUpload<any>(url, formData, params.token, 60000);\n } catch (e: any) { throw e; }\n }\n\n // URL-Encoded data is completely fine with Axios, no multipart files here.\n async formatBarcodeData(params: { textInput: string; token: string }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n if (env === 'SANDBOX') return { barcode_type: \"SANDBOX_MOCK\", first_name: \"JOHN\", last_name: \"DOE\" };\n const formData = new URLSearchParams();\n formData.append('text_input', params.textInput);\n \n try {\n const res = await axios.post(`${this.barcodeServiceURL}/format_barcode_data/`, formData.toString(), {\n headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': `Bearer ${params.token}` },\n timeout: 60000,\n });\n return res.data;\n } catch (e: any) { throw e; }\n }\n\n async extractMrzText(params: { fileUri: string; docType: string; docRegion: string; postfix?: string; token: string; template_path: string; mrz_type?: string; }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n if (env === 'SANDBOX') return { success: true, parsed_data: { status: 'success', document_type: params.docType } };\n \n const formData = new FormData();\n await appendFileToFormData(formData, 'file', params.fileUri, `id_card_${params.postfix || 'back'}.jpg`, 'image/jpeg');\n \n const safeMrzType = params.mrz_type && params.mrz_type.trim() !== '' ? params.mrz_type : 'TD1';\n const queryParams = new URLSearchParams({ \n doc_type: GovernmentDocumentTypeShorted[params.docType as GovernmentDocumentType] || params.docType, \n doc_region: params.docRegion, postfix: params.postfix || 'back', template_path: params.template_path, mrz_type: safeMrzType, reset_cache: 'true' \n }).toString();\n \n const url = `${this.mrzServiceURL}/extract_mrz_text/?${queryParams}`;\n \n try {\n const data = await this.crossPlatformMultipartUpload<any>(url, formData, params.token, 60000);\n if (Object.keys(data).length === 0) throw new Error('No data found');\n if (data?.success === false) throw new Error(`Lecture MRZ refusΓ©e: ${data.parsed_data?.status_message}`);\n return data;\n } catch (error: any) { throw error; }\n }\n\n async recognizeFace(params: { idPhotoUri: string; selfiePhotoUri: string }, env: KycEnvironment = 'PRODUCTION'): Promise<{ is_match: boolean; similarity: number; id_bbox?: number[]; selfie_bbox?: number[] }> {\n if (env === 'SANDBOX') return { is_match: true, similarity: 0.95 };\n const formData = new FormData();\n await appendFileToFormData(formData, 'id_photo', params.idPhotoUri, 'id_card_photo.jpg', 'image/jpeg');\n await appendFileToFormData(formData, 'selfie_photo', params.selfiePhotoUri, 'selfie_final.jpg', 'image/jpeg');\n \n try {\n const data = await this.crossPlatformMultipartUpload<any>(`${this.faceServiceURL}/recognize_face/`, formData, undefined, 45000);\n if (data?.detail) throw new Error(data.detail);\n return data;\n } catch (error: any) { throw error; }\n }\n\n // --- STANDARD AXIOS REQUESTS BELOW (UNCHANGED, SAFE) ---\n \n async healthFaceDetection(): Promise<any> { return (await axios.get(`${this.faceServiceURL}/health`)).data; }\n async healthTextExtraction(): Promise<any> { return (await axios.get(`${this.textExtractionServiceURL}/health`)).data; }\n async healthMrzService(): Promise<any> { return (await axios.get(`${this.mrzServiceURL}/health`)).data; }\n async healthOrientationService(): Promise<any> { return (await axios.get(`${this.orientationServiceURL}/health`)).data; }\n\n async newSession({ token, apiKey }: { token?: string, apiKey?: string }): Promise<SessionResponse> {\n try {\n const res = await axios.post<SessionResponse>(`${KYCConfig.getBackendUrl()}/verification/sessions/`, { \"status\": \"PENDING\", \"metadata\": {} }, {\n headers: { 'Content-Type': 'application/json', ...(apiKey ? { 'Authorization': `ApiKey ${apiKey}` } : { 'Authorization': `Bearer ${token}` }) }\n });\n return res.data;\n } catch (error: any) { throw error; }\n }\n\n async verificationSession(payload: VerificationSessionRequest): Promise<any> {\n try {\n const { session_id, step, data, templateId, action, apiKey } = payload;\n const token = apiKey ? undefined : await authentification();\n const normalizedData = { ...data };\n const rawDocType = normalizedData?.metadata?.document_type || normalizedData?.documentType || normalizedData?.documents?.documentType;\n \n if (rawDocType) {\n const mappedDocType = documentTypeMap[rawDocType] ?? rawDocType;\n normalizedData.metadata = { ...normalizedData.metadata, document_type: mappedDocType };\n normalizedData.documentType = mappedDocType;\n if (normalizedData.documents) {\n normalizedData.documents = { ...normalizedData.documents, documentType: mappedDocType };\n if (['passport', 'visa'].includes(mappedDocType.toLowerCase()) && !normalizedData.documents.back) normalizedData.documents.back = {};\n }\n }\n\n const payloadData = { action, data: { ...normalizedData, step, templateId }, session_id, timestamp: new Date().toISOString() };\n const res = await axios.post<SessionResponse>(`${KYCConfig.getBackendUrl()}/verification/api/kyc/sessions/${session_id}/steps/${step}/`, payloadData, {\n headers: { \"Content-Type\": \"application/json\", ...(apiKey ? { Authorization: `ApiKey ${apiKey}` } : {}), ...(token && !apiKey ? { Authorization: `Bearer ${token}` } : {}) }\n });\n return res.data;\n } catch (error: any) { throw error; }\n }\n\n async getVerificationResult(session_id: string, apiKey?: string): Promise<any> {\n try {\n const token = apiKey ? undefined : await authentification();\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 8000);\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (apiKey) headers[\"Authorization\"] = `ApiKey ${apiKey}`;\n else if (token) headers[\"Authorization\"] = `Bearer ${token}`;\n\n const res = await axios.get(`${KYCConfig.getBackendUrl()}/verification/api/kyc/result/?session_id=${session_id}`, { headers, signal: controller.signal });\n clearTimeout(timeoutId);\n return res.data;\n } catch (error: any) { throw error; }\n }\n\n async validateBackTemplate(params: { region: string; docType: string; frontTemplateName: string; backTemplateName: string; subRegion: string; token: string; }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n const queryParams = new URLSearchParams({ region: params.region, doc_type: params.docType, front_template_name: params.frontTemplateName, back_template_name: params.backTemplateName, sub_region: params.subRegion || \"\" }).toString();\n try {\n const res = await axios.post(`${this.mrzServiceURL}/validate_back_template/?${queryParams}`, null, {\n headers: { 'Accept': 'application/json', 'Authorization': `Bearer ${params.token}` }, timeout: 20000,\n });\n return res.data;\n } catch (e: any) { throw e; }\n }\n\n async sendEmailVerificationCode(email: string, auth?: { apiKey?: string; token?: string }): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/email/send/`;\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const res = await axios.post(\n url,\n { email },\n {\n headers: {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n },\n }\n );\n return res.data;\n }\n\n async verifyEmailCode(otp: string, auth?: { apiKey?: string; token?: string }): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/email/verify/`;\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const res = await axios.post(\n url,\n { otp },\n {\n headers: {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n },\n }\n );\n return res.data;\n }\n\n async sendWhatsAppVerificationCode(\n sessionId: string,\n phoneNumber: string,\n auth?: { apiKey?: string; token?: string }\n ): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/send-whatsapp-verification/`;\n const formattedPhoneNumber = phoneNumber.replace(/^\\+/, '');\n const payload = { session_id: sessionId, phone_number: formattedPhoneNumber };\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const headers = {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n };\n try {\n const res = await axios.post(url, payload, { headers });\n logger.log(\"β
WhatsApp Send Success:\", res.data);\n return res.data;\n } catch (error: any) {\n if (error.response) {\n logger.error(\"π WhatsApp Send Failed (Server Response):\", { status: error.response.status, data: error.response.data, headers: error.response.headers });\n }\n throw error;\n }\n }\n\n async verifyWhatsAppCode(\n sessionId: string,\n otp: string,\n phoneNumber: string,\n auth?: { apiKey?: string; token?: string }\n ): Promise<unknown> {\n const url = `${KYCConfig.getBackendUrl()}/accounts/verify-whatsapp-code/`;\n const formattedPhoneNumber = phoneNumber.replace(/^\\+/, '');\n const payload = { session_id: sessionId, verification_code: otp, phone_number: formattedPhoneNumber };\n const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());\n const headers = {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n };\n try {\n const res = await axios.post(url, payload, { headers });\n return res.data;\n } catch (error: any) {\n if (error.response) {\n logger.error(\"π WhatsApp Verification Failed (Server Response):\", { status: error.response.status, data: error.response.data, headers: error.response.headers });\n }\n throw error;\n }\n }\n\n async generateReferralCode(\n payload: { session_id: string; [key: string]: any },\n apiKey: string\n ): Promise<any> {\n try {\n logger.log(`Generating referral code for session: ${payload.session_id}`);\n if (!apiKey) {\n throw new Error(\"Authentication failed: API key is required.\");\n }\n const url = `${KYCConfig.getBackendUrl()}/core/referral-code/generate/`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `ApiKey ${apiKey}`\n };\n const res = await axios.post(url, payload, { headers, timeout: 8000 });\n logger.log(\"generateReferralCode SUCCESS:\", JSON.stringify(res.data, null, 2));\n return res.data;\n } catch (error: any) {\n const parsedError = errorMessage(error);\n const finalErrorMessage = parsedError || error?.message || \"Failed to generate referral code\";\n logger.error(\"Error generating referral code:\", typeof finalErrorMessage === 'string' ? finalErrorMessage : JSON.stringify(finalErrorMessage));\n throw new Error(typeof finalErrorMessage === 'string' ? finalErrorMessage : JSON.stringify(finalErrorMessage));\n }\n }\n}\n\nconst kycService = new KYCService(\"\", \"\");\nexport default kycService;\n\nexport function truncateFields(obj: any, maxLength = 420): any { /* logic unchanged */ return obj; }\n\nexport const authentification = async (): Promise<string> => {\n try {\n if (cachedToken && tokenExpiryTime && Date.now() < tokenExpiryTime - 10000) return cachedToken;\n if (activeAuthRequest) return activeAuthRequest;\n \n activeAuthRequest = (async () => {\n const res = await axios.post(\n `https://idms.sanctumkey.com/realms/kyc/protocol/openid-connect/token`,\n 'client_id=kyc_frontend&client_secret=QhgAmvKgmwODzsEp98dnA4PeUEMMaFHd&grant_type=client_credentials',\n { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }\n );\n \n const token = res.data.access_token;\n if (!token) {\n throw new Error(\"Keycloak returned a success response but no access_token was found.\");\n }\n \n cachedToken = token;\n tokenExpiryTime = Date.now() + ((res.data.expires_in || 300) * 1000);\n \n return cachedToken as string; // π¨ Guaranteed string to satisfy TypeScript\n })();\n \n return await activeAuthRequest;\n } catch (error: any) {\n cachedToken = null;\n activeAuthRequest = null;\n const safeErrorMessage = error?.response?.data?.error_description || error?.message || 'Unknown error';\n logger.error('Error authentifying:', safeErrorMessage);\n throw new Error(`Γchec de l'authentification: ${safeErrorMessage}`);\n }\n}\n\nexport const errorMessage = (error: any) => {\n return error.response?.data?.message || error.response?.data?.detail || error.response?.data?.error || error.response?.data || error.message;\n}"]}
|
package/package.json
CHANGED
|
@@ -126,33 +126,85 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
|
|
|
126
126
|
}
|
|
127
127
|
});
|
|
128
128
|
|
|
129
|
+
// 1. ISOLATE THE CALLBACK: This breaks the dependency death spiral for all platforms.
|
|
130
|
+
const onSilentCaptureRef = useRef(onSilentCapture);
|
|
131
|
+
useEffect(() => {
|
|
132
|
+
onSilentCaptureRef.current = onSilentCapture;
|
|
133
|
+
}, [onSilentCapture]);
|
|
134
|
+
|
|
135
|
+
// 2. THE CAPTURE FUNCTION: Zero dependencies. Immune to re-renders.
|
|
129
136
|
const captureSilentPhoto = useCallback(async () => {
|
|
130
|
-
|
|
137
|
+
// Web handles its own stream via WebBarcodeScanner; do not run native camera methods on web.
|
|
138
|
+
if (Platform.OS === 'web') return;
|
|
139
|
+
|
|
140
|
+
// We intentionally ignore `isInitialized`. If AVFoundation (iOS) or CameraX (Android)
|
|
141
|
+
// aren't ready, the try/catch will handle it gracefully.
|
|
142
|
+
if (!camera.current || isProcessingRef.current || isCapturingRef.current) return;
|
|
131
143
|
if (isAnalyzingRef.current) return;
|
|
132
144
|
|
|
133
145
|
try {
|
|
134
146
|
isCapturingRef.current = true;
|
|
147
|
+
|
|
135
148
|
const photo = await camera.current.takePhoto({
|
|
136
149
|
enableShutterSound: false,
|
|
137
150
|
flash: 'off',
|
|
138
|
-
|
|
139
|
-
...(Platform.OS === 'ios' ? {
|
|
140
|
-
photoCodec: 'jpeg',
|
|
141
|
-
qualityPrioritization: 'speed',
|
|
142
|
-
} : {})
|
|
151
|
+
// iOS requires aggressive compression to prevent RAM crashes during interval captures
|
|
152
|
+
...(Platform.OS === 'ios' ? { photoCodec: 'jpeg', qualityPrioritization: 'speed' } : {})
|
|
143
153
|
});
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
154
|
+
|
|
155
|
+
// 3. CROSS-PLATFORM PATH NORMALIZATION
|
|
156
|
+
let finalPath = photo.path;
|
|
157
|
+
let captureSuccess = true;
|
|
158
|
+
|
|
159
|
+
// 4. DEFENSIVE NATIVE MODULE EXECUTION
|
|
160
|
+
if (VisionCameraModule && VisionCameraModule.processPhotoResult) {
|
|
161
|
+
try {
|
|
162
|
+
const moduleResult = await VisionCameraModule.processPhotoResult(photo);
|
|
163
|
+
if (moduleResult) {
|
|
164
|
+
captureSuccess = moduleResult.success ?? true;
|
|
165
|
+
finalPath = moduleResult.path || photo.path;
|
|
166
|
+
}
|
|
167
|
+
} catch (nativeError) {
|
|
168
|
+
console.warn("β οΈ Native module failed, falling back to raw device path");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
onSilentCaptureRef.current?.({
|
|
173
|
+
success: captureSuccess,
|
|
174
|
+
path: finalPath,
|
|
175
|
+
barcode: scannedBarcodeRef.current
|
|
149
176
|
});
|
|
150
|
-
|
|
151
|
-
|
|
177
|
+
|
|
178
|
+
} catch (error: any) {
|
|
179
|
+
// πΈ Silent fail: The camera is busy, focusing, or warming up. Just wait for the next tick.
|
|
180
|
+
console.log(`πΈ Frame dropped (${Platform.OS}):`, error?.message);
|
|
152
181
|
} finally {
|
|
153
182
|
isCapturingRef.current = false;
|
|
154
183
|
}
|
|
155
|
-
}, [
|
|
184
|
+
}, []); // <-- EMPTY ARRAY GUARANTEES STABILITY
|
|
185
|
+
|
|
186
|
+
// 5. THE UNBREAKABLE INTERVAL
|
|
187
|
+
useEffect(() => {
|
|
188
|
+
if (!showCamera || isProcessing) return;
|
|
189
|
+
if (Platform.OS === 'web') return; // Let web handle its own interval logic
|
|
190
|
+
|
|
191
|
+
let active = true;
|
|
192
|
+
let id: ReturnType<typeof setInterval>;
|
|
193
|
+
|
|
194
|
+
// Slight delay to let the UI mount before hammering the camera hardware
|
|
195
|
+
const timer = setTimeout(() => {
|
|
196
|
+
if (!active) return;
|
|
197
|
+
const intervalDelay = isScanningBarcode ? 3000 : 1500;
|
|
198
|
+
id = setInterval(captureSilentPhoto, intervalDelay);
|
|
199
|
+
}, 1500);
|
|
200
|
+
|
|
201
|
+
return () => {
|
|
202
|
+
active = false;
|
|
203
|
+
clearTimeout(timer);
|
|
204
|
+
if (id) clearInterval(id);
|
|
205
|
+
};
|
|
206
|
+
}, [showCamera, isProcessing, isScanningBarcode, captureSilentPhoto]);
|
|
207
|
+
|
|
156
208
|
|
|
157
209
|
useEffect(() => {
|
|
158
210
|
if (!showCamera || !isInitialized || isProcessing) return;
|
|
@@ -558,6 +558,10 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({ component, value =
|
|
|
558
558
|
if (result.success && result.path) {
|
|
559
559
|
setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: true, success: false, error: '' }));
|
|
560
560
|
|
|
561
|
+
const safeCapturePath = Platform.OS === 'ios' && !result.path.startsWith('file://')
|
|
562
|
+
? `file://${result.path}`
|
|
563
|
+
: result.path;
|
|
564
|
+
|
|
561
565
|
let templatePath = capturedImages[currentSide]?.templatePath || '';
|
|
562
566
|
let templateBbox: IBbox | undefined;
|
|
563
567
|
let templateResponse: any;
|
|
@@ -568,7 +572,6 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({ component, value =
|
|
|
568
572
|
}
|
|
569
573
|
|
|
570
574
|
const issuingSubdivision = selectedDocumentType.region !== 'root' ? selectedDocumentType.region : undefined;
|
|
571
|
-
const safeCapturePath = (Platform.OS === 'ios' && !result.path.startsWith('file://')) ? `file://${result.path}` : result.path;
|
|
572
575
|
|
|
573
576
|
// π¨ WATCHDOG TIMER: If the iOS network drops and doesn't throw, this guarantees the UI unlocks after 20 seconds.
|
|
574
577
|
const watchdog = setTimeout(() => {
|