@sanctum-key/react-native-sdk 1.0.51 → 1.0.53
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/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/xml_file_paths.xml.flat +0 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +2 -2
- package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +1 -1
- package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +1 -1
- package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +1 -1
- package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +1 -1
- package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +41 -41
- package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
- package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +52 -52
- package/build/package.json +1 -1
- package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.js +73 -66
- package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
- package/build/src/components/TemplateKYCExample.d.ts +2 -1
- package/build/src/components/TemplateKYCExample.d.ts.map +1 -1
- package/build/src/components/TemplateKYCExample.js +20 -18
- package/build/src/components/TemplateKYCExample.js.map +1 -1
- package/build/src/components/TemplateKYCFlowRefactored.d.ts +1 -0
- package/build/src/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
- package/build/src/components/TemplateKYCFlowRefactored.js +20 -20
- package/build/src/components/TemplateKYCFlowRefactored.js.map +1 -1
- package/build/src/config/KYCConfig.d.ts.map +1 -1
- package/build/src/config/KYCConfig.js +4 -2
- package/build/src/config/KYCConfig.js.map +1 -1
- package/build/src/hooks/useTemplateKYCFlow.d.ts +1 -0
- package/build/src/hooks/useTemplateKYCFlow.d.ts.map +1 -1
- package/build/src/hooks/useTemplateKYCFlow.js.map +1 -1
- package/build/src/hooks/useTemplateLoader.d.ts.map +1 -1
- package/build/src/hooks/useTemplateLoader.js +0 -2
- package/build/src/hooks/useTemplateLoader.js.map +1 -1
- package/build/src/modules/api/CardAuthentification.d.ts +0 -23
- package/build/src/modules/api/CardAuthentification.d.ts.map +1 -1
- package/build/src/modules/api/CardAuthentification.js +46 -83
- package/build/src/modules/api/CardAuthentification.js.map +1 -1
- package/build/src/modules/api/KYCService.d.ts.map +1 -1
- package/build/src/modules/api/KYCService.js +96 -38
- package/build/src/modules/api/KYCService.js.map +1 -1
- package/build/src/modules/api/SelfieVerification.d.ts.map +1 -1
- package/build/src/modules/api/SelfieVerification.js +12 -19
- package/build/src/modules/api/SelfieVerification.js.map +1 -1
- package/build/src/modules/api/TemplateService.d.ts.map +1 -1
- package/build/src/modules/api/TemplateService.js +2 -1
- package/build/src/modules/api/TemplateService.js.map +1 -1
- package/build/src/modules/api/types.d.ts +34 -27
- package/build/src/modules/api/types.d.ts.map +1 -1
- package/build/src/modules/api/types.js.map +1 -1
- package/package.json +1 -1
- package/src/components/KYCElements/IDCardCapture.tsx +192 -191
- package/src/components/TemplateKYCExample.tsx +29 -20
- package/src/components/TemplateKYCFlowRefactored.tsx +33 -31
- package/src/config/KYCConfig.ts +7 -5
- package/src/hooks/useTemplateKYCFlow.tsx +1 -0
- package/src/hooks/useTemplateLoader.ts +0 -2
- package/src/modules/api/CardAuthentification.ts +409 -445
- package/src/modules/api/KYCService.ts +599 -449
- package/src/modules/api/SelfieVerification.ts +22 -29
- package/src/modules/api/TemplateService.ts +3 -2
- package/src/modules/api/types.ts +36 -29
|
@@ -90,7 +90,9 @@ export class KYCService {
|
|
|
90
90
|
}
|
|
91
91
|
async submitKYC(data) {
|
|
92
92
|
try {
|
|
93
|
-
const response = await axios.post(`${this.baseURL}/kyc/submit`, data, {
|
|
93
|
+
const response = await axios.post(`${this.baseURL}/kyc/submit`, data, {
|
|
94
|
+
headers: this.getHeaders()
|
|
95
|
+
});
|
|
94
96
|
return response.data;
|
|
95
97
|
}
|
|
96
98
|
catch (error) {
|
|
@@ -99,7 +101,9 @@ export class KYCService {
|
|
|
99
101
|
}
|
|
100
102
|
async detectFace(data) {
|
|
101
103
|
try {
|
|
102
|
-
const response = await axios.post(`${this.baseURL}/ai/face-detection`, data, {
|
|
104
|
+
const response = await axios.post(`${this.baseURL}/ai/face-detection`, data, {
|
|
105
|
+
headers: this.getHeaders()
|
|
106
|
+
});
|
|
103
107
|
return response.data;
|
|
104
108
|
}
|
|
105
109
|
catch (error) {
|
|
@@ -119,9 +123,6 @@ export class KYCService {
|
|
|
119
123
|
}
|
|
120
124
|
async processOrientationVideo(videoFile, env = 'PRODUCTION') {
|
|
121
125
|
try {
|
|
122
|
-
if (env === 'SANDBOX') {
|
|
123
|
-
return { success: true, data: { center: { captured: true, frame: 10 }, left: { captured: true, frame: 30 }, right: { captured: true, frame: 50 } }, message: 'SANDBOX Mock' };
|
|
124
|
-
}
|
|
125
126
|
const formData = new FormData();
|
|
126
127
|
await appendFileToFormData(formData, 'file', videoFile, 'orientation_video.mp4', 'video/mp4');
|
|
127
128
|
const data = await this.crossPlatformMultipartUpload(`${this.orientationServiceURL}/process_orientation_video_stream/`, formData, undefined, 90000);
|
|
@@ -129,15 +130,27 @@ export class KYCService {
|
|
|
129
130
|
}
|
|
130
131
|
catch (error) {
|
|
131
132
|
if (error.response?.status === 503) {
|
|
132
|
-
return {
|
|
133
|
+
return {
|
|
134
|
+
success: false,
|
|
135
|
+
error: {
|
|
136
|
+
code: 'SERVICE_UNAVAILABLE',
|
|
137
|
+
message: 'Service not ready',
|
|
138
|
+
details: error.response.data
|
|
139
|
+
},
|
|
140
|
+
message: 'Service temporarily unavailable'
|
|
141
|
+
};
|
|
133
142
|
}
|
|
134
|
-
return {
|
|
143
|
+
return {
|
|
144
|
+
success: false,
|
|
145
|
+
error: {
|
|
146
|
+
code: 'PROCESSING_ERROR',
|
|
147
|
+
message: error.response?.data?.detail || 'Unknown error occurred'
|
|
148
|
+
},
|
|
149
|
+
message: 'Failed to process orientation video'
|
|
150
|
+
};
|
|
135
151
|
}
|
|
136
152
|
}
|
|
137
153
|
async detectFaceOnId(idCardImageUri, token, docType, env = 'PRODUCTION') {
|
|
138
|
-
if (env === 'SANDBOX') {
|
|
139
|
-
return { result: true, detail: [{ confidence: 0.95, bbox: [50, 50, 200, 200] }], card_obb: { x: 50, y: 50, width: 200, height: 200 } };
|
|
140
|
-
}
|
|
141
154
|
const formData = new FormData();
|
|
142
155
|
await appendFileToFormData(formData, 'file', idCardImageUri, 'id_card_photo.jpg', 'image/jpeg');
|
|
143
156
|
const docTypeShorted = GovernmentDocumentTypeShorted[docType] || docType;
|
|
@@ -152,9 +165,6 @@ export class KYCService {
|
|
|
152
165
|
}
|
|
153
166
|
}
|
|
154
167
|
async checkTemplateType(params, env = 'PRODUCTION') {
|
|
155
|
-
if (env === 'SANDBOX') {
|
|
156
|
-
return { template_path: `templates/${params.docType}_${params.docRegion}_${params.postfix}.jpg`, card_obb: { x: 50, y: 50, width: 200, height: 200 } };
|
|
157
|
-
}
|
|
158
168
|
const formData = new FormData();
|
|
159
169
|
await appendFileToFormData(formData, 'file', params.fileUri, `id_card_${params.postfix}.jpg`, 'image/jpeg');
|
|
160
170
|
const docTypeShorted = GovernmentDocumentTypeShorted[params.docType];
|
|
@@ -197,8 +207,6 @@ export class KYCService {
|
|
|
197
207
|
}
|
|
198
208
|
}
|
|
199
209
|
async extractBarcode(params, env = 'PRODUCTION') {
|
|
200
|
-
if (env === 'SANDBOX')
|
|
201
|
-
return { barcode_data: 'SANDBOX_MOCK_BARCODE_DATA' };
|
|
202
210
|
const formData = new FormData();
|
|
203
211
|
await appendFileToFormData(formData, 'file', params.fileUri, `id_${params.postfix || 'back'}_photo.jpg`, 'image/jpeg');
|
|
204
212
|
const url = `${this.barcodeServiceURL}/decode_barcode/?doc_type=${encodeURIComponent(params.docType)}`;
|
|
@@ -211,13 +219,14 @@ export class KYCService {
|
|
|
211
219
|
}
|
|
212
220
|
// URL-Encoded data is completely fine with Axios, no multipart files here.
|
|
213
221
|
async formatBarcodeData(params, env = 'PRODUCTION') {
|
|
214
|
-
if (env === 'SANDBOX')
|
|
215
|
-
return { barcode_type: "SANDBOX_MOCK", first_name: "JOHN", last_name: "DOE" };
|
|
216
222
|
const formData = new URLSearchParams();
|
|
217
223
|
formData.append('text_input', params.textInput);
|
|
218
224
|
try {
|
|
219
225
|
const res = await axios.post(`${this.barcodeServiceURL}/format_barcode_data/`, formData.toString(), {
|
|
220
|
-
headers: {
|
|
226
|
+
headers: {
|
|
227
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
228
|
+
'Authorization': `Bearer ${params.token}`
|
|
229
|
+
},
|
|
221
230
|
timeout: 60000,
|
|
222
231
|
});
|
|
223
232
|
return res.data;
|
|
@@ -227,14 +236,16 @@ export class KYCService {
|
|
|
227
236
|
}
|
|
228
237
|
}
|
|
229
238
|
async extractMrzText(params, env = 'PRODUCTION') {
|
|
230
|
-
if (env === 'SANDBOX')
|
|
231
|
-
return { success: true, parsed_data: { status: 'success', document_type: params.docType } };
|
|
232
239
|
const formData = new FormData();
|
|
233
240
|
await appendFileToFormData(formData, 'file', params.fileUri, `id_card_${params.postfix || 'back'}.jpg`, 'image/jpeg');
|
|
234
241
|
const safeMrzType = params.mrz_type && params.mrz_type.trim() !== '' ? params.mrz_type : 'TD1';
|
|
235
242
|
const queryParams = new URLSearchParams({
|
|
236
243
|
doc_type: GovernmentDocumentTypeShorted[params.docType] || params.docType,
|
|
237
|
-
doc_region: params.docRegion,
|
|
244
|
+
doc_region: params.docRegion,
|
|
245
|
+
postfix: params.postfix || 'back',
|
|
246
|
+
template_path: params.template_path,
|
|
247
|
+
mrz_type: safeMrzType,
|
|
248
|
+
reset_cache: 'true'
|
|
238
249
|
}).toString();
|
|
239
250
|
const url = `${this.mrzServiceURL}/extract_mrz_text/?${queryParams}`;
|
|
240
251
|
try {
|
|
@@ -250,8 +261,6 @@ export class KYCService {
|
|
|
250
261
|
}
|
|
251
262
|
}
|
|
252
263
|
async recognizeFace(params, env = 'PRODUCTION') {
|
|
253
|
-
if (env === 'SANDBOX')
|
|
254
|
-
return { is_match: true, similarity: 0.95 };
|
|
255
264
|
const formData = new FormData();
|
|
256
265
|
await appendFileToFormData(formData, 'id_photo', params.idPhotoUri, 'id_card_photo.jpg', 'image/jpeg');
|
|
257
266
|
await appendFileToFormData(formData, 'selfie_photo', params.selfiePhotoUri, 'selfie_final.jpg', 'image/jpeg');
|
|
@@ -266,14 +275,28 @@ export class KYCService {
|
|
|
266
275
|
}
|
|
267
276
|
}
|
|
268
277
|
// --- STANDARD AXIOS REQUESTS BELOW (UNCHANGED, SAFE) ---
|
|
269
|
-
async healthFaceDetection() {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
async
|
|
278
|
+
async healthFaceDetection() {
|
|
279
|
+
return (await axios.get(`${this.faceServiceURL}/health`)).data;
|
|
280
|
+
}
|
|
281
|
+
async healthTextExtraction() {
|
|
282
|
+
return (await axios.get(`${this.textExtractionServiceURL}/health`)).data;
|
|
283
|
+
}
|
|
284
|
+
async healthMrzService() {
|
|
285
|
+
return (await axios.get(`${this.mrzServiceURL}/health`)).data;
|
|
286
|
+
}
|
|
287
|
+
async healthOrientationService() {
|
|
288
|
+
return (await axios.get(`${this.orientationServiceURL}/health`)).data;
|
|
289
|
+
}
|
|
273
290
|
async newSession({ token, apiKey }) {
|
|
274
291
|
try {
|
|
275
|
-
const res = await axios.post(`${KYCConfig.getBackendUrl()}/verification/sessions/`, {
|
|
276
|
-
|
|
292
|
+
const res = await axios.post(`${KYCConfig.getBackendUrl()}/verification/sessions/`, {
|
|
293
|
+
"status": "PENDING",
|
|
294
|
+
"metadata": {}
|
|
295
|
+
}, {
|
|
296
|
+
headers: {
|
|
297
|
+
'Content-Type': 'application/json',
|
|
298
|
+
...(apiKey ? { 'Authorization': `ApiKey ${apiKey}` } : { 'Authorization': `Bearer ${token}` })
|
|
299
|
+
}
|
|
277
300
|
});
|
|
278
301
|
return res.data;
|
|
279
302
|
}
|
|
@@ -297,9 +320,18 @@ export class KYCService {
|
|
|
297
320
|
normalizedData.documents.back = {};
|
|
298
321
|
}
|
|
299
322
|
}
|
|
300
|
-
const payloadData = {
|
|
323
|
+
const payloadData = {
|
|
324
|
+
action,
|
|
325
|
+
data: { ...normalizedData, step, templateId },
|
|
326
|
+
session_id,
|
|
327
|
+
timestamp: new Date().toISOString()
|
|
328
|
+
};
|
|
301
329
|
const res = await axios.post(`${KYCConfig.getBackendUrl()}/verification/api/kyc/sessions/${session_id}/steps/${step}/`, payloadData, {
|
|
302
|
-
headers: {
|
|
330
|
+
headers: {
|
|
331
|
+
"Content-Type": "application/json",
|
|
332
|
+
...(apiKey ? { Authorization: `ApiKey ${apiKey}` } : {}),
|
|
333
|
+
...(token && !apiKey ? { Authorization: `Bearer ${token}` } : {})
|
|
334
|
+
}
|
|
303
335
|
});
|
|
304
336
|
return res.data;
|
|
305
337
|
}
|
|
@@ -312,12 +344,17 @@ export class KYCService {
|
|
|
312
344
|
const token = apiKey ? undefined : await authentification();
|
|
313
345
|
const controller = new AbortController();
|
|
314
346
|
const timeoutId = setTimeout(() => controller.abort(), 8000);
|
|
315
|
-
const headers = {
|
|
347
|
+
const headers = {
|
|
348
|
+
'Content-Type': 'application/json'
|
|
349
|
+
};
|
|
316
350
|
if (apiKey)
|
|
317
351
|
headers["Authorization"] = `ApiKey ${apiKey}`;
|
|
318
352
|
else if (token)
|
|
319
353
|
headers["Authorization"] = `Bearer ${token}`;
|
|
320
|
-
const res = await axios.get(`${KYCConfig.getBackendUrl()}/verification/api/kyc/result/?session_id=${session_id}`, {
|
|
354
|
+
const res = await axios.get(`${KYCConfig.getBackendUrl()}/verification/api/kyc/result/?session_id=${session_id}`, {
|
|
355
|
+
headers,
|
|
356
|
+
signal: controller.signal
|
|
357
|
+
});
|
|
321
358
|
clearTimeout(timeoutId);
|
|
322
359
|
return res.data;
|
|
323
360
|
}
|
|
@@ -326,10 +363,20 @@ export class KYCService {
|
|
|
326
363
|
}
|
|
327
364
|
}
|
|
328
365
|
async validateBackTemplate(params, env = 'PRODUCTION') {
|
|
329
|
-
const queryParams = new URLSearchParams({
|
|
366
|
+
const queryParams = new URLSearchParams({
|
|
367
|
+
region: params.region,
|
|
368
|
+
doc_type: params.docType,
|
|
369
|
+
front_template_name: params.frontTemplateName,
|
|
370
|
+
back_template_name: params.backTemplateName,
|
|
371
|
+
sub_region: params.subRegion || ""
|
|
372
|
+
}).toString();
|
|
330
373
|
try {
|
|
331
374
|
const res = await axios.post(`${this.mrzServiceURL}/validate_back_template/?${queryParams}`, null, {
|
|
332
|
-
headers: {
|
|
375
|
+
headers: {
|
|
376
|
+
'Accept': 'application/json',
|
|
377
|
+
'Authorization': `Bearer ${params.token}`
|
|
378
|
+
},
|
|
379
|
+
timeout: 20000,
|
|
333
380
|
});
|
|
334
381
|
return res.data;
|
|
335
382
|
}
|
|
@@ -375,7 +422,11 @@ export class KYCService {
|
|
|
375
422
|
}
|
|
376
423
|
catch (error) {
|
|
377
424
|
if (error.response) {
|
|
378
|
-
logger.error("🛑 WhatsApp Send Failed (Server Response):", {
|
|
425
|
+
logger.error("🛑 WhatsApp Send Failed (Server Response):", {
|
|
426
|
+
status: error.response.status,
|
|
427
|
+
data: error.response.data,
|
|
428
|
+
headers: error.response.headers
|
|
429
|
+
});
|
|
379
430
|
}
|
|
380
431
|
throw error;
|
|
381
432
|
}
|
|
@@ -395,7 +446,11 @@ export class KYCService {
|
|
|
395
446
|
}
|
|
396
447
|
catch (error) {
|
|
397
448
|
if (error.response) {
|
|
398
|
-
logger.error("🛑 WhatsApp Verification Failed (Server Response):", {
|
|
449
|
+
logger.error("🛑 WhatsApp Verification Failed (Server Response):", {
|
|
450
|
+
status: error.response.status,
|
|
451
|
+
data: error.response.data,
|
|
452
|
+
headers: error.response.headers
|
|
453
|
+
});
|
|
399
454
|
}
|
|
400
455
|
throw error;
|
|
401
456
|
}
|
|
@@ -425,7 +480,10 @@ export class KYCService {
|
|
|
425
480
|
}
|
|
426
481
|
const kycService = new KYCService("", "");
|
|
427
482
|
export default kycService;
|
|
428
|
-
export function truncateFields(obj, maxLength = 420) {
|
|
483
|
+
export function truncateFields(obj, maxLength = 420) {
|
|
484
|
+
/* logic unchanged */
|
|
485
|
+
return obj;
|
|
486
|
+
}
|
|
429
487
|
export const authentification = async () => {
|
|
430
488
|
try {
|
|
431
489
|
if (cachedToken && tokenExpiryTime && Date.now() < tokenExpiryTime - 10000)
|
|
@@ -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 // 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 activeAuthRequest = null; // 🚨 FIX: Clear the promise once resolved\n \n return cachedToken as string;\n })();\n \n return await activeAuthRequest;\n } catch (error: any) {\n cachedToken = null;\n tokenExpiryTime = null; \n activeAuthRequest = null;\n \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 clearAuthToken = () => {\n logger.log(\"Wiping AI services auth token cache...\");\n cachedToken = null;\n tokenExpiryTime = null;\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 || error.message;\n}"]}
|
|
1
|
+
{"version":3,"file":"KYCService.js","sourceRoot":"","sources":["../../../../src/modules/api/KYCService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAA0B,6BAA6B,EAA4B,MAAM,uBAAuB,CAAC;AAIxH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAE/C,MAAM,oBAAoB,GAAG,KAAK,EAAE,QAAkB,EAAE,GAAW,EAAE,GAAW,EAAE,OAAe,UAAU,EAAE,OAAe,YAAY,EAAE,EAAE;IACxI,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACJ,gCAAgC;QAChC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAS,CAAC,CAAC;IACrD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAA2B;IAC5C,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,iBAAiB;IACjC,mBAAmB,EAAE,uBAAuB;IAC5C,eAAe,EAAE,0BAA0B;IAC3C,YAAY,EAAE,eAAe;IAC7B,UAAU,EAAE,eAAe;IAC3B,WAAW,EAAE,eAAe;IAC5B,eAAe,EAAE,iBAAiB;IAClC,eAAe,EAAE,iBAAiB;IAClC,eAAe,EAAE,iBAAiB;IAClC,mBAAmB,EAAE,0BAA0B;CAClD,CAAC;AAEF,IAAI,WAAW,GAAkB,IAAI,CAAC;AACtC,IAAI,eAAe,GAAkB,IAAI,CAAC;AAC1C,IAAI,iBAAiB,GAA2B,IAAI,CAAC;AAoCrD,MAAM,OAAO,UAAU;IACX,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,cAAc,GAAG,oCAAoC,CAAC;IACtD,wBAAwB,GAAG,oCAAoC,CAAC;IAChE,aAAa,GAAG,mCAAmC,CAAC;IACpD,iBAAiB,GAAG,oCAAoC,CAAC;IACzD,qBAAqB,GAAG,4BAA4B,CAAC;IAE7D,YAAY,OAAe,EAAE,MAAc;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAEO,UAAU;QACd,OAAO;YACH,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACxC,cAAc,EAAE,kBAAkB;SACrC,CAAC;IACN,CAAC;IAED,mCAAmC;IACnC,iEAAiE;IACzD,KAAK,CAAC,4BAA4B,CAAI,GAAW,EAAE,QAAkB,EAAE,KAAc,EAAE,YAAoB,KAAK;QACpH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAElE,MAAM,OAAO,GAA2B;YACpC,QAAQ,EAAE,kBAAkB;SAC/B,CAAC;QACF,IAAI,KAAK;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;QAExD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC9B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,0DAA0D;gBACnE,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,UAAU,CAAC,MAAM;aAC5B,CAAC,CAAC;YAEH,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,YAAY,CAAC;YACjB,IAAI,CAAC;gBACD,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,YAAY,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;YAC5C,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,wEAAwE;gBACxE,MAAM,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC;YACxE,CAAC;YACD,OAAO,YAAiB,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC;YACnE,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAgB;QAC5B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,EAAE,IAAI,EAAE;gBAClE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;aAC7B,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAA0B;QACvC,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,oBAAoB,EAAE,IAAI,EAAE;gBACzE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;aAC7B,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,+BAA+B,CAAC,SAAiB,EAAE,KAAa;QAClE,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,EAAE,YAAY,CAAC,CAAC;YAE5F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAChD,GAAG,IAAI,CAAC,cAAc,2BAA2B,EACjD,QAAQ,EACR,KAAK,EACL,KAAK,CACR,CAAC;YAEF,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,SAAiB,EAAE,MAAsB,YAAY;QAC/E,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,uBAAuB,EAAE,WAAW,CAAC,CAAC;YAE9F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAChD,GAAG,IAAI,CAAC,qBAAqB,oCAAoC,EACjE,QAAQ,EACR,SAAS,EACT,KAAK,CACR,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC;QAC9F,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBACjC,OAAO;oBACH,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;wBACH,IAAI,EAAE,qBAAqB;wBAC3B,OAAO,EAAE,mBAAmB;wBAC5B,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;qBAC/B;oBACD,OAAO,EAAE,iCAAiC;iBAC7C,CAAC;YACN,CAAC;YACD,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACH,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,wBAAwB;iBACpE;gBACD,OAAO,EAAE,qCAAqC;aACjD,CAAC;QACN,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,cAAsB,EAAE,KAAa,EAAE,OAAe,EAAE,MAAsB,YAAY;QAC3G,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAAC;QAEhG,MAAM,cAAc,GAAG,6BAA6B,CAAC,OAAiC,CAAC,IAAI,OAAO,CAAC;QAEnG,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAChD,GAAG,IAAI,CAAC,cAAc,0BAA0B,cAAc,EAAE,EAChE,QAAQ,EACR,KAAK,EACL,KAAK,CACR,CAAC;YAEF,IAAI,IAAI,EAAE,MAAM;gBAAE,OAAO,IAAI,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,IAAI,oBAAoB,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAA6H,EAAE,MAAsB,YAAY;QACrL,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,MAAM,CAAC,OAAO,MAAM,EAAE,YAAY,CAAC,CAAC;QAE5G,MAAM,cAAc,GAAG,6BAA6B,CAAC,MAAM,CAAC,OAAiC,CAAC,CAAC;QAE/F,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,mCAAmC,kBAAkB,CAAC,cAAc,CAAC,eAAe,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC;QACpL,IAAI,MAAM,CAAC,kBAAkB;YAAE,GAAG,IAAI,wBAAwB,kBAAkB,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAE9G,IAAI,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,4BAA4B,CAA4B,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAClH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,MAAM,CAAC,CAAC;QACZ,CAAC;IACL,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,MAAmJ;QAChL,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,MAAM,CAAC,OAAO,IAAI,OAAO,MAAM,EAAE,YAAY,CAAC,CAAC;QAEvH,IAAI,WAAW,GAAG,YAAY,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,MAAM,CAAC,OAAO,IAAI,OAAO,eAAe,CAAC;QAEjO,IAAI,MAAM,CAAC,kBAAkB;YAAE,WAAW,IAAI,wBAAwB,kBAAkB,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAEtH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,wBAAwB,6BAA6B,WAAW,EAAE,CAAC;QAEvF,IAAI,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAM,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAEtG,MAAM,KAAK,GAAG,YAAY,EAAE,MAAM,CAAC;YACnC,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAE/D,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,wBAAwB,mCAAmC,KAAK,EAAE,CAAC;YAE7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBACxD,iEAAiE;gBACjE,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;gBAEzG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW;oBAAE,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;gBACxE,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,6BAA6B,CAAC,CAAC;YACnH,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,MAAM,CAAC,CAAC;QACZ,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAA6E,EAAE,MAAsB,YAAY;QAClI,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,MAAM,CAAC,OAAO,IAAI,MAAM,YAAY,EAAE,YAAY,CAAC,CAAC;QAEvH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,iBAAiB,6BAA6B,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAEvG,IAAI,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,4BAA4B,CAAM,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5F,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,MAAM,CAAC,CAAC;QACZ,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,iBAAiB,CAAC,MAA4C,EAAE,MAAsB,YAAY;QACpG,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QACvC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAEhD,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,iBAAiB,uBAAuB,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE;gBAChG,OAAO,EAAE;oBACL,cAAc,EAAE,mCAAmC;oBACnD,eAAe,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;iBAC5C;gBACD,OAAO,EAAE,KAAK;aACjB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,IAAI,CAAC;QACpB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,MAAM,CAAC,CAAC;QACZ,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAA2I,EAAE,MAAsB,YAAY;QAChM,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,MAAM,CAAC,OAAO,IAAI,MAAM,MAAM,EAAE,YAAY,CAAC,CAAC;QAEtH,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;QAE/F,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;YACpC,QAAQ,EAAE,6BAA6B,CAAC,MAAM,CAAC,OAAiC,CAAC,IAAI,MAAM,CAAC,OAAO;YACnG,UAAU,EAAE,MAAM,CAAC,SAAS;YAC5B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM;YACjC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,MAAM;SACtB,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEd,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,sBAAsB,WAAW,EAAE,CAAC;QAErE,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAM,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9F,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YACrE,IAAI,IAAI,EAAE,OAAO,KAAK,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;YACzG,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAsD,EAAE,MAAsB,YAAY;QAC1G,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAAC;QACvG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC;QAE9G,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAM,GAAG,IAAI,CAAC,cAAc,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAChI,IAAI,IAAI,EAAE,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,0DAA0D;IAE1D,KAAK,CAAC,mBAAmB;QACrB,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,oBAAoB;QACtB,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,wBAAwB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,gBAAgB;QAClB,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,wBAAwB;QAC1B,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,qBAAqB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAuC;QACnE,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAkB,GAAG,SAAS,CAAC,aAAa,EAAE,yBAAyB,EAAE;gBACjG,QAAQ,EAAE,SAAS;gBACnB,UAAU,EAAE,EAAE;aACjB,EAAE;gBACC,OAAO,EAAE;oBACL,cAAc,EAAE,kBAAkB;oBAClC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;iBACjG;aACJ,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,IAAI,CAAC;QACpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,OAAmC;QACzD,IAAI,CAAC;YACD,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YACvE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,gBAAgB,EAAE,CAAC;YAC5D,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YAEnC,MAAM,UAAU,GAAG,cAAc,EAAE,QAAQ,EAAE,aAAa,IAAI,cAAc,EAAE,YAAY,IAAI,cAAc,EAAE,SAAS,EAAE,YAAY,CAAC;YAEtI,IAAI,UAAU,EAAE,CAAC;gBACb,MAAM,aAAa,GAAG,eAAe,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;gBAChE,cAAc,CAAC,QAAQ,GAAG,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;gBACvF,cAAc,CAAC,YAAY,GAAG,aAAa,CAAC;gBAE5C,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;oBAC3B,cAAc,CAAC,SAAS,GAAG,EAAE,GAAG,cAAc,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;oBACxF,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI;wBAC5F,cAAc,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,CAAC;gBAC3C,CAAC;YACL,CAAC;YAED,MAAM,WAAW,GAAG;gBAChB,MAAM;gBACN,IAAI,EAAE,EAAE,GAAG,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE;gBAC7C,UAAU;gBACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAkB,GAAG,SAAS,CAAC,aAAa,EAAE,kCAAkC,UAAU,UAAU,IAAI,GAAG,EAAE,WAAW,EAAE;gBAClJ,OAAO,EAAE;oBACL,cAAc,EAAE,kBAAkB;oBAClC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxD,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpE;aACJ,CAAC,CAAC;YAEH,OAAO,GAAG,CAAC,IAAI,CAAC;QACpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,UAAkB,EAAE,MAAe;QAC3D,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,gBAAgB,EAAE,CAAC;YAC5D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,OAAO,GAA2B;gBACpC,cAAc,EAAE,kBAAkB;aACrC,CAAC;YAEF,IAAI,MAAM;gBAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;iBACrD,IAAI,KAAK;gBAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;YAE7D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,aAAa,EAAE,4CAA4C,UAAU,EAAE,EAAE;gBAC9G,OAAO;gBACP,MAAM,EAAE,UAAU,CAAC,MAAM;aAC5B,CAAC,CAAC;YAEH,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO,GAAG,CAAC,IAAI,CAAC;QACpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,MAAmI,EAAE,MAAsB,YAAY;QAC9L,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;YACpC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,OAAO;YACxB,mBAAmB,EAAE,MAAM,CAAC,iBAAiB;YAC7C,kBAAkB,EAAE,MAAM,CAAC,gBAAgB;YAC3C,UAAU,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;SACrC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEd,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,4BAA4B,WAAW,EAAE,EAAE,IAAI,EAAE;gBAC/F,OAAO,EAAE;oBACL,QAAQ,EAAE,kBAAkB;oBAC5B,eAAe,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;iBAC5C;gBACD,OAAO,EAAE,KAAK;aACjB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,IAAI,CAAC;QACpB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,MAAM,CAAC,CAAC;QACZ,CAAC;IACL,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,KAAa,EAAE,IAA0C;QACrF,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,uBAAuB,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,MAAM,gBAAgB,EAAE,CAAC,CAAC;QAEnF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CACxB,GAAG,EACH,EAAE,KAAK,EAAE,EACT;YACI,OAAO,EAAE;gBACL,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;aAC5G;SACJ,CACJ,CAAC;QACF,OAAO,GAAG,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAW,EAAE,IAA0C;QACzE,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,yBAAyB,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,MAAM,gBAAgB,EAAE,CAAC,CAAC;QAEnF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CACxB,GAAG,EACH,EAAE,GAAG,EAAE,EACP;YACI,OAAO,EAAE;gBACL,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;aAC5G;SACJ,CACJ,CAAC;QACF,OAAO,GAAG,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,4BAA4B,CAC9B,SAAiB,EACjB,WAAmB,EACnB,IAA0C;QAE1C,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,uCAAuC,CAAC;QAChF,MAAM,oBAAoB,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAC;QAC9E,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,MAAM,gBAAgB,EAAE,CAAC,CAAC;QAEnF,MAAM,OAAO,GAAG;YACZ,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;SAC5G,CAAC;QAEF,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACjD,OAAO,GAAG,CAAC,IAAI,CAAC;QACpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE;oBACvD,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;oBAC7B,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;oBACzB,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO;iBAClC,CAAC,CAAC;YACP,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,kBAAkB,CACpB,SAAiB,EACjB,GAAW,EACX,WAAmB,EACnB,IAA0C;QAE1C,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,iCAAiC,CAAC;QAC1E,MAAM,oBAAoB,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAC;QACtG,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,MAAM,gBAAgB,EAAE,CAAC,CAAC;QAEnF,MAAM,OAAO,GAAG;YACZ,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;SAC5G,CAAC;QAEF,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACxD,OAAO,GAAG,CAAC,IAAI,CAAC;QACpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,CAAC,oDAAoD,EAAE;oBAC/D,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;oBAC7B,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;oBACzB,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO;iBAClC,CAAC,CAAC;YACP,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,oBAAoB,CACtB,OAAkD,EAClD,MAAc;QAEd,IAAI,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,yCAAyC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,+BAA+B,CAAC;YACxE,MAAM,OAAO,GAA2B;gBACpC,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,MAAM,EAAE;aACtC,CAAC;YAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/E,OAAO,GAAG,CAAC,IAAI,CAAC;QACpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,iBAAiB,GAAG,WAAW,IAAI,KAAK,EAAE,OAAO,IAAI,kCAAkC,CAAC;YAC9F,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,OAAO,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC/I,MAAM,IAAI,KAAK,CAAC,OAAO,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACnH,CAAC;IACL,CAAC;CACJ;AAED,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC1C,eAAe,UAAU,CAAC;AAE1B,MAAM,UAAU,cAAc,CAAC,GAAQ,EAAE,SAAS,GAAG,GAAG;IACpD,qBAAqB;IACrB,OAAO,GAAG,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAAqB,EAAE;IACxD,IAAI,CAAC;QACD,IAAI,WAAW,IAAI,eAAe,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,GAAG,KAAK;YAAE,OAAO,WAAW,CAAC;QAC/F,IAAI,iBAAiB;YAAE,OAAO,iBAAiB,CAAC;QAEhD,iBAAiB,GAAG,CAAC,KAAK,IAAI,EAAE;YAC5B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CACxB,sEAAsE,EACtE,qGAAqG,EACrG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE,EAAE,CACvE,CAAC;YAEF,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YACpC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;YAC3F,CAAC;YAED,WAAW,GAAG,KAAK,CAAC;YACpB,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YACrE,iBAAiB,GAAG,IAAI,CAAC,CAAC,0CAA0C;YACpE,OAAO,WAAqB,CAAC;QACjC,CAAC,CAAC,EAAE,CAAC;QAEL,OAAO,MAAM,iBAAiB,CAAC;IACnC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,WAAW,GAAG,IAAI,CAAC;QACnB,eAAe,GAAG,IAAI,CAAC;QACvB,iBAAiB,GAAG,IAAI,CAAC;QACzB,MAAM,gBAAgB,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,IAAI,KAAK,EAAE,OAAO,IAAI,eAAe,CAAC;QACvG,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,gCAAgC,gBAAgB,EAAE,CAAC,CAAC;IACxE,CAAC;AACL,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IAC/B,MAAM,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACrD,WAAW,GAAG,IAAI,CAAC;IACnB,eAAe,GAAG,IAAI,CAAC;IACvB,iBAAiB,GAAG,IAAI,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAU,EAAE,EAAE;IACvC,OAAO,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC;AACjJ,CAAC,CAAA","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 {\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 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 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 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, {\n headers: this.getHeaders()\n });\n return response.data;\n } catch (error) {\n throw error;\n }\n }\n\n async detectFace(data: FaceDetectionRequest): Promise<FaceDetectionResponse> {\n try {\n const response = await axios.post(`${this.baseURL}/ai/face-detection`, data, {\n headers: this.getHeaders()\n });\n return response.data;\n } catch (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 data = await this.crossPlatformMultipartUpload<SelfieVideoResponse[]>(\n `${this.faceServiceURL}/detect_face_orientation/`,\n formData,\n token,\n 20000\n );\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async processOrientationVideo(videoFile: string, env: KycEnvironment = 'PRODUCTION'): Promise<OrientationVideoResponse> {\n try {\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/`,\n formData,\n undefined,\n 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 {\n success: false,\n error: {\n code: 'SERVICE_UNAVAILABLE',\n message: 'Service not ready',\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 || 'Unknown error occurred'\n },\n message: 'Failed to process orientation video'\n };\n }\n }\n\n async detectFaceOnId(idCardImageUri: string, token: string, docType: string, env: KycEnvironment = 'PRODUCTION'): Promise<{ result: boolean; detail: any[]; card_obb?: any }> {\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\n try {\n const data = await this.crossPlatformMultipartUpload<any>(\n `${this.faceServiceURL}/detect_face/?doc_type=${docTypeShorted}`,\n formData,\n token,\n 20000\n );\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 const formData = new FormData();\n await appendFileToFormData(formData, 'file', params.fileUri, `id_card_${params.postfix}.jpg`, 'image/jpeg');\n\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) {\n throw e;\n }\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\n if (params.issuingSubdivision) queryParams += `&issuing_subdivision=${encodeURIComponent(params.issuingSubdivision)}`;\n\n const url = `${this.textExtractionServiceURL}/extract_doc_information/?${queryParams}`;\n\n try {\n const startResData = await this.crossPlatformMultipartUpload<any>(url, formData, params.token, 60000);\n\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\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\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\n throw new Error(\"Document extraction timed out waiting for results.\");\n } catch (e: any) {\n throw e;\n }\n }\n\n async extractBarcode(params: { fileUri: string; token: string; docType: string; postfix?: string }, env: KycEnvironment = 'PRODUCTION'): Promise<any> {\n const formData = new FormData();\n await appendFileToFormData(formData, 'file', params.fileUri, `id_${params.postfix || 'back'}_photo.jpg`, 'image/jpeg');\n\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) {\n throw e;\n }\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 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: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': `Bearer ${params.token}`\n },\n timeout: 60000,\n });\n return res.data;\n } catch (e: any) {\n throw e;\n }\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 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\n const queryParams = new URLSearchParams({\n doc_type: GovernmentDocumentTypeShorted[params.docType as GovernmentDocumentType] || params.docType,\n doc_region: params.docRegion,\n postfix: params.postfix || 'back',\n template_path: params.template_path,\n mrz_type: safeMrzType,\n 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) {\n throw error;\n }\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 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) {\n throw error;\n }\n }\n\n // --- STANDARD AXIOS REQUESTS BELOW (UNCHANGED, SAFE) ---\n \n async healthFaceDetection(): Promise<any> {\n return (await axios.get(`${this.faceServiceURL}/health`)).data;\n }\n\n async healthTextExtraction(): Promise<any> {\n return (await axios.get(`${this.textExtractionServiceURL}/health`)).data;\n }\n\n async healthMrzService(): Promise<any> {\n return (await axios.get(`${this.mrzServiceURL}/health`)).data;\n }\n\n async healthOrientationService(): Promise<any> {\n return (await axios.get(`${this.orientationServiceURL}/health`)).data;\n }\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/`, {\n \"status\": \"PENDING\",\n \"metadata\": {}\n }, {\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 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 const normalizedData = { ...data };\n\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\n if (normalizedData.documents) {\n normalizedData.documents = { ...normalizedData.documents, documentType: mappedDocType };\n if (['passport', 'visa'].includes(mappedDocType.toLowerCase()) && !normalizedData.documents.back)\n normalizedData.documents.back = {};\n }\n }\n\n const payloadData = {\n action,\n data: { ...normalizedData, step, templateId },\n session_id,\n timestamp: new Date().toISOString()\n };\n\n const res = await axios.post<SessionResponse>(`${KYCConfig.getBackendUrl()}/verification/api/kyc/sessions/${session_id}/steps/${step}/`, payloadData, {\n headers: {\n \"Content-Type\": \"application/json\",\n ...(apiKey ? { Authorization: `ApiKey ${apiKey}` } : {}),\n ...(token && !apiKey ? { Authorization: `Bearer ${token}` } : {})\n }\n });\n\n return res.data;\n } catch (error: any) {\n throw error;\n }\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\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n };\n\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}`, {\n headers,\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n return res.data;\n } catch (error: any) {\n throw error;\n }\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({\n region: params.region,\n doc_type: params.docType,\n front_template_name: params.frontTemplateName,\n back_template_name: params.backTemplateName,\n sub_region: params.subRegion || \"\"\n }).toString();\n\n try {\n const res = await axios.post(`${this.mrzServiceURL}/validate_back_template/?${queryParams}`, null, {\n headers: {\n 'Accept': 'application/json',\n 'Authorization': `Bearer ${params.token}`\n },\n timeout: 20000,\n });\n return res.data;\n } catch (e: any) {\n throw e;\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\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\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\n const headers = {\n 'Content-Type': 'application/json',\n ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),\n };\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\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 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\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 /* logic unchanged */\n return obj;\n}\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 activeAuthRequest = null; // 🚨 FIX: Clear the promise once resolved\n return cachedToken as string;\n })();\n\n return await activeAuthRequest;\n } catch (error: any) {\n cachedToken = null;\n tokenExpiryTime = 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 clearAuthToken = () => {\n logger.log(\"Wiping AI services auth token cache...\");\n cachedToken = null;\n tokenExpiryTime = null;\n activeAuthRequest = null;\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}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelfieVerification.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/SelfieVerification.ts"],"names":[],"mappings":"AAAA,OAAmB,EAAoB,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"SelfieVerification.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/SelfieVerification.ts"],"names":[],"mappings":"AAAA,OAAmB,EAAoB,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,QAAA,MAAM,kBAAkB,GACtB,aAAa,MAAM,EACnB,MAAK,cAA6B,KACjC,OAAO,CAAC,mBAAmB,EAAE,CAiB/B,CAAA;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -1,25 +1,18 @@
|
|
|
1
1
|
import kycService, { authentification } from "./KYCService";
|
|
2
2
|
const selfieVerification = async (selfieImage, env = 'PRODUCTION') => {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}];
|
|
16
|
-
return mockResponse;
|
|
3
|
+
try {
|
|
4
|
+
const token = await authentification();
|
|
5
|
+
// Perform actual AI verification against the API
|
|
6
|
+
// (Note: if your KYCService method accepts the env parameter for URL switching
|
|
7
|
+
// like the document endpoints do, you can add it here as the 3rd argument: `(selfieImage, token, env)`)
|
|
8
|
+
const response = await kycService.processSelfieOrientationPicture(selfieImage, token);
|
|
9
|
+
console.log("selfieVerification response", JSON.stringify(response, null, 2));
|
|
10
|
+
return response;
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
console.error("Error in selfieVerification:", error?.message || error);
|
|
14
|
+
throw error;
|
|
17
15
|
}
|
|
18
|
-
// PRODUCTION mode: perform actual AI verification
|
|
19
|
-
const token = await authentification();
|
|
20
|
-
const response = await kycService.processSelfieOrientationPicture(selfieImage, token);
|
|
21
|
-
console.log("selfieVerification response", JSON.stringify(response, null, 2));
|
|
22
|
-
return response;
|
|
23
16
|
};
|
|
24
17
|
export default selfieVerification;
|
|
25
18
|
//# sourceMappingURL=SelfieVerification.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelfieVerification.js","sourceRoot":"","sources":["../../../../src/modules/api/SelfieVerification.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,EAAE,EAAE,gBAAgB,EAAuB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"SelfieVerification.js","sourceRoot":"","sources":["../../../../src/modules/api/SelfieVerification.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,EAAE,EAAE,gBAAgB,EAAuB,MAAM,cAAc,CAAC;AAGjF,MAAM,kBAAkB,GAAG,KAAK,EAC9B,WAAmB,EACnB,MAAsB,YAAY,EACF,EAAE;IAElC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAEvC,iDAAiD;QACjD,gFAAgF;QAChF,wGAAwG;QACxG,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAEtF,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE9E,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;QACvE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAA;AAED,eAAe,kBAAkB,CAAC","sourcesContent":["import kycService, { authentification, SelfieVideoResponse } from \"./KYCService\"; \nimport { KycEnvironment } from \"../../types/env.types\"; \n\nconst selfieVerification = async (\n selfieImage: string, \n env: KycEnvironment = 'PRODUCTION'\n): Promise<SelfieVideoResponse[]> => { \n \n try {\n const token = await authentification(); \n \n // Perform actual AI verification against the API\n // (Note: if your KYCService method accepts the env parameter for URL switching \n // like the document endpoints do, you can add it here as the 3rd argument: `(selfieImage, token, env)`)\n const response = await kycService.processSelfieOrientationPicture(selfieImage, token); \n \n console.log(\"selfieVerification response\", JSON.stringify(response, null, 2)); \n \n return response;\n } catch (error: any) {\n console.error(\"Error in selfieVerification:\", error?.message || error);\n throw error;\n }\n} \n\nexport default selfieVerification;"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateService.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/TemplateService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAuB,MAAM,uBAAuB,CAAC;AAKhF,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAA+E;IAC5F,OAAO,CAAC,YAAY,CAAiB;IAErC;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB;;;;;;;OAOG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,GAAE,OAAc,GACvB,OAAO,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"TemplateService.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/TemplateService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAuB,MAAM,uBAAuB,CAAC;AAKhF,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAA+E;IAC5F,OAAO,CAAC,YAAY,CAAiB;IAErC;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB;;;;;;;OAOG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,GAAE,OAAc,GACvB,OAAO,CAAC,kBAAkB,CAAC;IAkE9B;;;OAGG;IACH,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAUrC;;;;OAIG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAahE;;;;;OAKG;IACG,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAiB1J;AAGD,QAAA,MAAM,eAAe,sBAA6B,CAAC;AACnD,eAAe,eAAe,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
-
import { logger } from '../../utils/logger';
|
|
2
|
+
import { logger, sdkLogger } from '../../utils/logger';
|
|
3
3
|
import { errorMessage } from './KYCService';
|
|
4
4
|
import KYCConfig from '../../config/KYCConfig';
|
|
5
5
|
export class TemplateServiceClass {
|
|
@@ -69,6 +69,7 @@ export class TemplateServiceClass {
|
|
|
69
69
|
}
|
|
70
70
|
catch (error) {
|
|
71
71
|
logger.error(`Error fetching template ${templateId}:`, JSON.stringify(errorMessage(error), null, 2));
|
|
72
|
+
sdkLogger.error(`Error fetching template ${templateId}:`, JSON.stringify(errorMessage(error), null, 2));
|
|
72
73
|
// Extract backend error message if available
|
|
73
74
|
const backendMessage = errorMessage(error);
|
|
74
75
|
if (error.response?.status === 404) {
|