@sanctum-key/react-native-sdk 1.0.53 → 1.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -2
- package/android/build/.transforms/3db9b15041d4285a820fc84462995ea1/results.bin +1 -0
- package/android/build/.transforms/3db9b15041d4285a820fc84462995ea1/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
- package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +1 -1
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
- package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
- package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$BarcodeRegion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$1$5$1.class → SanctumKeySdkModule$definition$1$6$1.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$1$5$2.class → SanctumKeySdkModule$definition$1$6$2.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$1.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunction$1.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$5.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunction$2.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$3.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunction$3.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$4.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunction$4.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$2.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunction$5.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$6.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunction$6.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$1.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$1.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$3.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$2.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$3.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$4.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$2.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$5.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$6.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$4.class → SanctumKeySdkModule$definition$lambda$16$$inlined$AsyncFunctionWithPromise$7.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$$inlined$View$1.class → SanctumKeySdkModule$definition$lambda$16$$inlined$View$1.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$lambda$4$$inlined$Prop$1.class → SanctumKeySdkModule$definition$lambda$16$lambda$15$$inlined$Prop$1.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/{SanctumKeySdkModule$definition$lambda$5$lambda$4$$inlined$Prop$2.class → SanctumKeySdkModule$definition$lambda$16$lambda$15$$inlined$Prop$2.class} +0 -0
- package/android/build/tmp/kotlin-classes/debug/kyc/sanctumkey/com/SanctumKeySdkModule.class +0 -0
- package/android/build.gradle +7 -0
- package/android/src/main/java/kyc/sanctumkey/com/SanctumKeySdkModule.kt +428 -1
- package/build/package.json +3 -1
- package/build/src/SanctumKeySdkModule.d.ts +1 -0
- package/build/src/SanctumKeySdkModule.d.ts.map +1 -1
- package/build/src/SanctumKeySdkModule.js.map +1 -1
- package/build/src/components/EnhancedCameraView.d.ts.map +1 -1
- package/build/src/components/EnhancedCameraView.js +50 -41
- package/build/src/components/EnhancedCameraView.js.map +1 -1
- package/build/src/components/EnhancedCameraView.web.d.ts +2 -0
- package/build/src/components/EnhancedCameraView.web.d.ts.map +1 -1
- package/build/src/components/EnhancedCameraView.web.js +11 -6
- package/build/src/components/EnhancedCameraView.web.js.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.js +499 -78
- package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
- package/build/src/components/TemplateKYCExample.d.ts.map +1 -1
- package/build/src/components/TemplateKYCExample.js +3 -9
- package/build/src/components/TemplateKYCExample.js.map +1 -1
- package/build/src/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
- package/build/src/components/TemplateKYCFlowRefactored.js +0 -2
- package/build/src/components/TemplateKYCFlowRefactored.js.map +1 -1
- package/build/src/components/WebBarcodeScanner.d.ts +2 -0
- package/build/src/components/WebBarcodeScanner.d.ts.map +1 -1
- package/build/src/components/WebBarcodeScanner.js +99 -85
- package/build/src/components/WebBarcodeScanner.js.map +1 -1
- package/build/src/modules/api/KYCService.d.ts +1 -0
- package/build/src/modules/api/KYCService.d.ts.map +1 -1
- package/build/src/modules/api/KYCService.js +1 -1
- package/build/src/modules/api/KYCService.js.map +1 -1
- package/build/src/modules/api/types.d.ts +1 -0
- package/build/src/modules/api/types.d.ts.map +1 -1
- package/build/src/modules/api/types.js.map +1 -1
- package/build/src/web/WebKYCEntry.d.ts.map +1 -1
- package/build/src/web/WebKYCEntry.js +50 -32
- package/build/src/web/WebKYCEntry.js.map +1 -1
- package/package.json +3 -1
- package/plugin/build/withVisionCamera.d.ts +1 -0
- package/plugin/build/withVisionCamera.js +13 -1
- package/plugin/src/withVisionCamera.js +18 -2
- package/plugin/src/withVisionCamera.ts +19 -2
- package/src/SanctumKeySdkModule.ts +1 -0
- package/src/components/EnhancedCameraView.tsx +52 -41
- package/src/components/EnhancedCameraView.web.tsx +15 -5
- package/src/components/KYCElements/IDCardCapture.tsx +552 -75
- package/src/components/TemplateKYCExample.tsx +6 -14
- package/src/components/TemplateKYCFlowRefactored.tsx +0 -2
- package/src/components/WebBarcodeScanner.tsx +147 -198
- package/src/modules/api/KYCService.ts +3 -3
- package/src/modules/api/types.ts +1 -0
- package/src/web/WebKYCEntry.tsx +89 -50
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebBarcodeScanner.js","sourceRoot":"","sources":["../../../src/components/WebBarcodeScanner.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useRef } from 'react';\nimport {\n MultiFormatReader,\n BarcodeFormat,\n DecodeHintType,\n HTMLCanvasElementLuminanceSource,\n BinaryBitmap,\n HybridBinarizer,\n GlobalHistogramBinarizer,\n} from '@zxing/library';\n\ninterface WebBarcodeScannerProps {\n videoRef: React.RefObject<HTMLVideoElement | null>;\n active: boolean;\n onBarcodeScanned: (value: string) => void;\n}\n\nexport const WebBarcodeScanner: React.FC<WebBarcodeScannerProps> = ({\n videoRef,\n active,\n onBarcodeScanned,\n}) => {\n const readerRef = useRef<MultiFormatReader | null>(null);\n\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n const lastValueRef = useRef<string | null>(null);\n\n const stoppedRef = useRef(false);\n\n const callbackRef = useRef(onBarcodeScanned);\n\n useEffect(() => {\n callbackRef.current = onBarcodeScanned;\n }, [onBarcodeScanned]);\n\n const decodeBitmap = useCallback(\n (canvas: HTMLCanvasElement) => {\n if (!readerRef.current) {\n return null;\n }\n\n const source = new HTMLCanvasElementLuminanceSource(canvas);\n\n const attempts = [\n new BinaryBitmap(\n new HybridBinarizer(source)\n ),\n new BinaryBitmap(\n new GlobalHistogramBinarizer(source)\n ),\n ];\n\n for (const bitmap of attempts) {\n try {\n const result =\n readerRef.current.decodeWithState(bitmap);\n\n if (result?.getText()) {\n return result.getText();\n }\n } catch {\n // continue\n }\n }\n\n return null;\n },\n []\n );\n\n const drawROI = useCallback(\n (\n video: HTMLVideoElement,\n canvas: HTMLCanvasElement\n ) => {\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true,\n });\n\n if (!ctx) {\n return false;\n }\n\n const roi = 0.8;\n\n const sw = Math.floor(\n video.videoWidth * roi\n );\n\n const sh = Math.floor(\n video.videoHeight * roi\n );\n\n const sx = Math.floor(\n (video.videoWidth - sw) / 2\n );\n\n const sy = Math.floor(\n (video.videoHeight - sh) / 2\n );\n\n if (\n canvas.width !== sw ||\n canvas.height !== sh\n ) {\n canvas.width = sw;\n canvas.height = sh;\n }\n\n ctx.drawImage(\n video,\n sx,\n sy,\n sw,\n sh,\n 0,\n 0,\n sw,\n sh\n );\n\n return true;\n },\n []\n );\n\n // Add a persistent rotation canvas ref at the top\nconst rotationCanvasRef = useRef<HTMLCanvasElement | null>(null);\n\n// Update rotateCanvas to re-use the persistent canvas\nconst rotateCanvas = useCallback(\n (sourceCanvas: HTMLCanvasElement, degrees: number) => {\n if (!rotationCanvasRef.current) {\n rotationCanvasRef.current = document.createElement('canvas');\n }\n const rotated = rotationCanvasRef.current;\n const ctx = rotated.getContext('2d');\n if (!ctx) return null;\n\n const radians = (degrees * Math.PI) / 180;\n if (degrees === 90 || degrees === -90) {\n rotated.width = sourceCanvas.height;\n rotated.height = sourceCanvas.width;\n } else {\n rotated.width = sourceCanvas.width;\n rotated.height = sourceCanvas.height;\n }\n\n ctx.clearRect(0, 0, rotated.width, rotated.height);\n ctx.translate(rotated.width / 2, rotated.height / 2);\n ctx.rotate(radians);\n ctx.drawImage(sourceCanvas, -sourceCanvas.width / 2, -sourceCanvas.height / 2);\n return rotated;\n },\n []\n);\n\n\n\n const tryDecode = useCallback(() => {\n const video = videoRef.current;\n\n const canvas = canvasRef.current;\n\n if (\n !video ||\n !canvas ||\n video.readyState < 2\n ) {\n return null;\n }\n\n const ok = drawROI(video, canvas);\n\n if (!ok) {\n return null;\n }\n\n let value = decodeBitmap(canvas);\n\n if (value) {\n return value;\n }\n\n const rotations = [90, -90, 180];\n\n for (const rotation of rotations) {\n const rotated = rotateCanvas(\n canvas,\n rotation\n );\n\n if (!rotated) {\n continue;\n }\n\n value = decodeBitmap(rotated);\n\n if (value) {\n return value;\n }\n }\n\n return null;\n }, [\n videoRef,\n drawROI,\n decodeBitmap,\n rotateCanvas,\n ]);\n\nconst tick = useCallback(() => {\n if (stoppedRef.current) return;\n \n const value = tryDecode();\n if (value && value !== lastValueRef.current) {\n lastValueRef.current = value;\n callbackRef.current(value);\n // If you want it to stop scanning on success, leave 'return;' \n // but ensure your parent component handles unmounting the scanner!\n return; \n }\n \n setTimeout(tick, 100);\n }, [tryDecode]);\n\n useEffect(() => {\n if (!active) {\n return;\n }\n\n stoppedRef.current = false;\n\n lastValueRef.current = null;\n\n if (!canvasRef.current) {\n canvasRef.current =\n document.createElement('canvas');\n }\n\n const hints = new Map();\n\n hints.set(\n DecodeHintType.POSSIBLE_FORMATS,\n [BarcodeFormat.PDF_417]\n );\n\n hints.set(\n DecodeHintType.TRY_HARDER,\n true\n );\n\n const reader =\n new MultiFormatReader();\n\n reader.setHints(hints);\n\n readerRef.current = reader;\n\n tick();\n\n return () => {\n stoppedRef.current = true;\n\n readerRef.current?.reset();\n\n readerRef.current = null;\n };\n }, [active, tick]);\n\n return null;\n};"]}
|
|
1
|
+
{"version":3,"file":"WebBarcodeScanner.js","sourceRoot":"","sources":["../../../src/components/WebBarcodeScanner.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useRef } from 'react';\nimport type { CodeType } from 'react-native-vision-camera';\nimport {\n MultiFormatReader,\n BarcodeFormat,\n DecodeHintType,\n HTMLCanvasElementLuminanceSource,\n BinaryBitmap,\n HybridBinarizer,\n GlobalHistogramBinarizer,\n} from '@zxing/library';\n\ninterface WebBarcodeScannerProps {\n videoRef: React.RefObject<HTMLVideoElement | null>;\n active: boolean;\n onBarcodeScanned: (value: string) => void;\n formats?: CodeType[];\n}\n\ninterface RoiProfile {\n width: number;\n height: number;\n contrast: number;\n}\n\nconst ROI_PROFILES: RoiProfile[] = [\n // Full frame catches barcodes before the user has centered them.\n { width: 1, height: 1, contrast: 1 },\n // Most ID barcodes sit in the wide center strip shown by the overlay.\n { width: 0.98, height: 0.64, contrast: 1 },\n // A tighter, contrast-enhanced pass helps very dense or low-contrast PDF417.\n { width: 0.94, height: 0.46, contrast: 1.55 },\n];\n\nconst ROTATIONS = [180, 90, -90];\nconst DEFAULT_FORMATS: CodeType[] = ['pdf-417'];\n\nconst ZXING_FORMATS: Partial<Record<CodeType, BarcodeFormat>> = {\n 'pdf-417': BarcodeFormat.PDF_417,\n 'code-128': BarcodeFormat.CODE_128,\n 'code-39': BarcodeFormat.CODE_39,\n 'code-93': BarcodeFormat.CODE_93,\n codabar: BarcodeFormat.CODABAR,\n 'ean-13': BarcodeFormat.EAN_13,\n 'ean-8': BarcodeFormat.EAN_8,\n itf: BarcodeFormat.ITF,\n 'itf-14': BarcodeFormat.ITF,\n 'upc-a': BarcodeFormat.UPC_A,\n 'upc-e': BarcodeFormat.UPC_E,\n qr: BarcodeFormat.QR_CODE,\n aztec: BarcodeFormat.AZTEC,\n 'data-matrix': BarcodeFormat.DATA_MATRIX,\n 'gs1-data-bar': BarcodeFormat.RSS_14,\n 'gs1-data-bar-limited': BarcodeFormat.RSS_14,\n 'gs1-data-bar-expanded': BarcodeFormat.RSS_EXPANDED,\n};\n\nexport const WebBarcodeScanner: React.FC<WebBarcodeScannerProps> = ({\n videoRef,\n active,\n onBarcodeScanned,\n formats = DEFAULT_FORMATS,\n}) => {\n const readerRef = useRef<MultiFormatReader | null>(null);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const rotationCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const lastValueRef = useRef<{ value: string | null; emittedAt: number }>({ value: null, emittedAt: 0 });\n const attemptRef = useRef(0);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const stoppedRef = useRef(false);\n const callbackRef = useRef(onBarcodeScanned);\n\n useEffect(() => {\n callbackRef.current = onBarcodeScanned;\n }, [onBarcodeScanned]);\n\n const decodeBitmap = useCallback((canvas: HTMLCanvasElement) => {\n if (!readerRef.current || canvas.width === 0 || canvas.height === 0) return null;\n\n const source = new HTMLCanvasElementLuminanceSource(canvas);\n const attempts = [\n new BinaryBitmap(new HybridBinarizer(source)),\n new BinaryBitmap(new GlobalHistogramBinarizer(source)),\n ];\n\n for (const bitmap of attempts) {\n try {\n const result = readerRef.current.decodeWithState(bitmap);\n const text = result?.getText();\n if (text) return text;\n } catch {\n // Try the next binarization strategy/rotation.\n }\n }\n\n return null;\n }, []);\n\n const drawROI = useCallback((video: HTMLVideoElement, canvas: HTMLCanvasElement, profile: RoiProfile) => {\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) return false;\n\n const sourceWidth = Math.max(1, Math.floor(video.videoWidth * profile.width));\n const sourceHeight = Math.max(1, Math.floor(video.videoHeight * profile.height));\n const sourceX = Math.floor((video.videoWidth - sourceWidth) / 2);\n const sourceY = Math.floor((video.videoHeight - sourceHeight) / 2);\n\n // Nearest-neighbour enlargement gives ZXing more pixels per narrow module\n // on sub-1080p browser streams without allocating an unbounded canvas.\n const desiredScale = sourceWidth < 1600 ? Math.min(1.75, 1600 / sourceWidth) : 1;\n const boundedScale = Math.min(desiredScale, 2800 / Math.max(sourceWidth, sourceHeight));\n const outputWidth = Math.max(1, Math.floor(sourceWidth * boundedScale));\n const outputHeight = Math.max(1, Math.floor(sourceHeight * boundedScale));\n\n if (canvas.width !== outputWidth || canvas.height !== outputHeight) {\n canvas.width = outputWidth;\n canvas.height = outputHeight;\n }\n\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, outputWidth, outputHeight);\n ctx.imageSmoothingEnabled = false;\n ctx.filter = profile.contrast === 1 ? 'none' : `grayscale(1) contrast(${profile.contrast})`;\n ctx.drawImage(\n video,\n sourceX,\n sourceY,\n sourceWidth,\n sourceHeight,\n 0,\n 0,\n outputWidth,\n outputHeight,\n );\n ctx.filter = 'none';\n return true;\n }, []);\n\n const rotateCanvas = useCallback((sourceCanvas: HTMLCanvasElement, degrees: number) => {\n if (!rotationCanvasRef.current) rotationCanvasRef.current = document.createElement('canvas');\n\n const rotated = rotationCanvasRef.current;\n const swapDimensions = Math.abs(degrees) === 90;\n rotated.width = swapDimensions ? sourceCanvas.height : sourceCanvas.width;\n rotated.height = swapDimensions ? sourceCanvas.width : sourceCanvas.height;\n\n const ctx = rotated.getContext('2d', { willReadFrequently: true });\n if (!ctx) return null;\n\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, rotated.width, rotated.height);\n ctx.translate(rotated.width / 2, rotated.height / 2);\n ctx.rotate((degrees * Math.PI) / 180);\n ctx.drawImage(sourceCanvas, -sourceCanvas.width / 2, -sourceCanvas.height / 2);\n return rotated;\n }, []);\n\n const tryDecode = useCallback(() => {\n const video = videoRef.current;\n const canvas = canvasRef.current;\n if (!video || !canvas || video.readyState < 2 || video.videoWidth === 0 || video.videoHeight === 0) return null;\n\n const attempt = attemptRef.current++;\n const profile = ROI_PROFILES[attempt % ROI_PROFILES.length];\n if (!drawROI(video, canvas, profile)) return null;\n\n const directValue = decodeBitmap(canvas);\n if (directValue) return directValue;\n\n // Spread rotation work over successive frames to keep the UI responsive.\n const rotation = ROTATIONS[attempt % ROTATIONS.length];\n const rotated = rotateCanvas(canvas, rotation);\n return rotated ? decodeBitmap(rotated) : null;\n }, [decodeBitmap, drawROI, rotateCanvas, videoRef]);\n\n const tick = useCallback(() => {\n if (stoppedRef.current) return;\n\n const value = tryDecode();\n if (value) {\n const now = Date.now();\n const previous = lastValueRef.current;\n if (value !== previous.value || now - previous.emittedAt > 1500) {\n lastValueRef.current = { value, emittedAt: now };\n callbackRef.current(value);\n }\n }\n\n timerRef.current = setTimeout(tick, 180);\n }, [tryDecode]);\n\n useEffect(() => {\n if (!active) return;\n\n stoppedRef.current = false;\n attemptRef.current = 0;\n lastValueRef.current = { value: null, emittedAt: 0 };\n if (!canvasRef.current) canvasRef.current = document.createElement('canvas');\n\n const possibleFormats = Array.from(new Set(\n formats.map(format => ZXING_FORMATS[format]).filter((format): format is BarcodeFormat => format !== undefined),\n ));\n const hints = new Map();\n hints.set(DecodeHintType.POSSIBLE_FORMATS, possibleFormats.length > 0 ? possibleFormats : [BarcodeFormat.PDF_417]);\n hints.set(DecodeHintType.TRY_HARDER, true);\n\n const reader = new MultiFormatReader();\n reader.setHints(hints);\n readerRef.current = reader;\n tick();\n\n return () => {\n stoppedRef.current = true;\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = null;\n readerRef.current?.reset();\n readerRef.current = null;\n };\n }, [active, formats, tick]);\n\n return null;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KYCService.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/KYCService.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"KYCService.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/KYCService.ts"],"names":[],"mappings":"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"}
|
|
@@ -211,7 +211,7 @@ export class KYCService {
|
|
|
211
211
|
await appendFileToFormData(formData, 'file', params.fileUri, `id_${params.postfix || 'back'}_photo.jpg`, 'image/jpeg');
|
|
212
212
|
const url = `${this.barcodeServiceURL}/decode_barcode/?doc_type=${encodeURIComponent(params.docType)}`;
|
|
213
213
|
try {
|
|
214
|
-
return await this.crossPlatformMultipartUpload(url, formData, params.token, 60000);
|
|
214
|
+
return await this.crossPlatformMultipartUpload(url, formData, params.token, params.timeoutMs ?? 60000);
|
|
215
215
|
}
|
|
216
216
|
catch (e) {
|
|
217
217
|
throw e;
|
|
@@ -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 {\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
|
+
{"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 {\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; timeoutMs?: number }, 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, params.timeoutMs ?? 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}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,0BAA0B;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,uBAAuB,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAG1D,MAAM,WAAW,kBAAkB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,SAAS,CAAC,EAAE;YACV,oBAAoB,CAAC,EAAE;gBACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;aACjC,CAAC;SACH,CAAC;QACF,WAAW,CAAC,EAAE;YACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;CACH"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,0BAA0B;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,uBAAuB,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAG1D,MAAM,WAAW,kBAAkB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,SAAS,CAAC,EAAE;YACV,oBAAoB,CAAC,EAAE;gBACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;gBAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;aACjC,CAAC;SACH,CAAC;QACF,WAAW,CAAC,EAAE;YACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;CACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/modules/api/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface SessionResponse {\n id: number;\n session_id: string;\n status: string;\n created_at: string;\n updated_at: string;\n metadata: string;\n user: number;\n module: number;\n}\n\n\nexport interface VerificationSessionRequest {\n step: number;\n data: VerificationSessionData;\n templateId: string | null;\n session_id: string;\n token: string;\n action: string\n apiKey?: string;\n}\n\n\n// dynamic type\nexport type VerificationSessionData = Record<string, any>;\n\n\nexport interface VerificationResult {\n message?: string;\n status?: string;\n referenceId?: string;\n issues?: string[];\n data?: {\n session_id?: string;\n verification_id?: string;\n verification_status?: string;\n completion_timestamp?: string;\n user_data?: {\n personal_information?: {\n full_name?: string | null;\n first_name?: string | null;\n last_name?: string | null;\n given_name?: string | null;\n surname?: string | null;\n date_of_birth?: string | null;\n birth_date?: string | null;\n sex?: string | null;\n expiry_date?: string | null;\n issue_date?: string | null;\n issue_place?: string | null;\n place_of_birth?: string | null;\n address?: string | null;\n city?: string | null;\n postal_code?: string | null;\n country?: string | null;\n nationality?: string | null;\n document_number?: string | null;\n };\n };\n selfie_info?: {\n is_match?: boolean;\n similarity?: number;\n image?: string;\n };\n };\n }"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/modules/api/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface SessionResponse {\n id: number;\n session_id: string;\n status: string;\n created_at: string;\n updated_at: string;\n metadata: string;\n user: number;\n module: number;\n}\n\n\nexport interface VerificationSessionRequest {\n step: number;\n data: VerificationSessionData;\n templateId: string | null;\n session_id: string;\n token: string;\n action: string\n apiKey?: string;\n}\n\n\n// dynamic type\nexport type VerificationSessionData = Record<string, any>;\n\n\nexport interface VerificationResult {\n message?: string;\n status?: string;\n referenceId?: string;\n issues?: string[];\n data?: {\n session_id?: string;\n verification_id?: string;\n verification_status?: string;\n document_type?: string;\n completion_timestamp?: string;\n user_data?: {\n personal_information?: {\n full_name?: string | null;\n first_name?: string | null;\n last_name?: string | null;\n given_name?: string | null;\n surname?: string | null;\n date_of_birth?: string | null;\n birth_date?: string | null;\n sex?: string | null;\n expiry_date?: string | null;\n issue_date?: string | null;\n issue_place?: string | null;\n place_of_birth?: string | null;\n address?: string | null;\n city?: string | null;\n postal_code?: string | null;\n country?: string | null;\n nationality?: string | null;\n document_number?: string | null;\n };\n };\n selfie_info?: {\n is_match?: boolean;\n similarity?: number;\n image?: string;\n };\n };\n }"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebKYCEntry.d.ts","sourceRoot":"","sources":["../../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAoC,GAAG,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"WebKYCEntry.d.ts","sourceRoot":"","sources":["../../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAoC,GAAG,EAAE,MAAM,OAAO,CAAC;AASrE,UAAU,gBAAgB;IACxB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AA6ED,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAoP3G;AAYD,eAAe,WAAW,CAAC"}
|
|
@@ -4,8 +4,19 @@ import { useI18n } from '../hooks/useI18n';
|
|
|
4
4
|
import { TemplateKYCExample } from '../components/TemplateKYCExample';
|
|
5
5
|
import { isCallbackUrlAllowed } from '../config/allowedDomains';
|
|
6
6
|
import KYCConfig from '../config/KYCConfig';
|
|
7
|
-
|
|
7
|
+
import CryptoJS from 'crypto-js'; // 🚨 IMPORT ADDED
|
|
8
|
+
// 🚨 MODIFIED: Accepts the webhook secret to generate the signature
|
|
9
|
+
const postWebhook = async (url, payload, secret, timeoutMs = 5000) => {
|
|
8
10
|
const body = JSON.stringify(payload);
|
|
11
|
+
const headers = {
|
|
12
|
+
'Content-Type': 'application/json',
|
|
13
|
+
};
|
|
14
|
+
// 🚨 Generate HMAC SHA-256 Signature if secret is provided
|
|
15
|
+
if (secret) {
|
|
16
|
+
const signature = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);
|
|
17
|
+
headers['x-sanctumkey-signature'] = signature;
|
|
18
|
+
console.log("🔒 Generated Webhook Signature:", signature);
|
|
19
|
+
}
|
|
9
20
|
const postWithTimeout = async (init) => {
|
|
10
21
|
const controller = new AbortController();
|
|
11
22
|
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
@@ -18,7 +29,7 @@ const postWebhook = async (url, payload, timeoutMs = 5000) => {
|
|
|
18
29
|
};
|
|
19
30
|
if (typeof window !== 'undefined') {
|
|
20
31
|
try {
|
|
21
|
-
const response = await postWithTimeout({ headers
|
|
32
|
+
const response = await postWithTimeout({ headers, body, keepalive: true });
|
|
22
33
|
if (!response.ok)
|
|
23
34
|
throw new Error(`Webhook failed with status ${response.status}`);
|
|
24
35
|
return;
|
|
@@ -26,11 +37,17 @@ const postWebhook = async (url, payload, timeoutMs = 5000) => {
|
|
|
26
37
|
catch (error) {
|
|
27
38
|
if (error instanceof Error && error.name === 'AbortError')
|
|
28
39
|
throw error;
|
|
29
|
-
|
|
40
|
+
// Fallback for CORS issues, though signature headers might be stripped in 'no-cors' mode
|
|
41
|
+
await postWithTimeout({
|
|
42
|
+
mode: 'no-cors',
|
|
43
|
+
headers: { 'Content-Type': 'text/plain;charset=UTF-8' },
|
|
44
|
+
body,
|
|
45
|
+
keepalive: true
|
|
46
|
+
});
|
|
30
47
|
return;
|
|
31
48
|
}
|
|
32
49
|
}
|
|
33
|
-
const response = await postWithTimeout({ headers
|
|
50
|
+
const response = await postWithTimeout({ headers, body });
|
|
34
51
|
if (!response.ok)
|
|
35
52
|
throw new Error(`Webhook failed with status ${response.status}`);
|
|
36
53
|
};
|
|
@@ -88,7 +105,14 @@ export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave }) {
|
|
|
88
105
|
}
|
|
89
106
|
if (window.parent !== window) {
|
|
90
107
|
const targetOrigin = new URL(return_url).origin;
|
|
91
|
-
window.parent.postMessage({
|
|
108
|
+
window.parent.postMessage({
|
|
109
|
+
type: 'kyc_result',
|
|
110
|
+
status: params.status,
|
|
111
|
+
kyc_id: params.kyc_id,
|
|
112
|
+
message: params.message,
|
|
113
|
+
processing_state: params.processing_state,
|
|
114
|
+
verification_steps: params.verification_steps
|
|
115
|
+
}, targetOrigin);
|
|
92
116
|
}
|
|
93
117
|
else {
|
|
94
118
|
window.location.href = return_url;
|
|
@@ -104,21 +128,12 @@ export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave }) {
|
|
|
104
128
|
const isStillProcessing = data?.isProcessing || data?.session?.isProcessing;
|
|
105
129
|
if (urlParams.push_url) {
|
|
106
130
|
try {
|
|
107
|
-
// 1. Locate the actual backend payload from the Context state
|
|
108
131
|
const backendResult = data?.verification?.result || data?.result?.result || data?.result || data;
|
|
109
|
-
|
|
110
|
-
const finalSessionId = data?.session?.session_id ||
|
|
111
|
-
backendResult?.session_id ||
|
|
112
|
-
backendResult?.data?.session_id ||
|
|
113
|
-
urlParams.kyc_id ||
|
|
114
|
-
'unknown';
|
|
115
|
-
// 3. Extract the core data payload
|
|
132
|
+
const finalSessionId = data?.session?.session_id || backendResult?.session_id || backendResult?.data?.session_id || urlParams.kyc_id || 'unknown';
|
|
116
133
|
let parsedKycData = {};
|
|
117
134
|
if (backendResult?.data) {
|
|
118
135
|
try {
|
|
119
|
-
parsedKycData = typeof backendResult.data === 'string'
|
|
120
|
-
? JSON.parse(backendResult.data)
|
|
121
|
-
: backendResult.data;
|
|
136
|
+
parsedKycData = typeof backendResult.data === 'string' ? JSON.parse(backendResult.data) : backendResult.data;
|
|
122
137
|
}
|
|
123
138
|
catch (e) {
|
|
124
139
|
console.warn("Could not parse backendResult.data JSON");
|
|
@@ -143,11 +158,11 @@ export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave }) {
|
|
|
143
158
|
const hasValidSessionId = finalSessionId && finalSessionId !== 'unknown';
|
|
144
159
|
const hasValidData = parsedKycData && Object.keys(parsedKycData).length > 0;
|
|
145
160
|
if (!hasValidSessionId || !hasValidData) {
|
|
146
|
-
console.log("Webhook Blocked: Payload contains no data or session_id is unknown."
|
|
161
|
+
console.log("Webhook Blocked: Payload contains no data or session_id is unknown.");
|
|
147
162
|
}
|
|
148
163
|
else {
|
|
149
|
-
|
|
150
|
-
await postWebhook(urlParams.push_url, verificationState, 5000);
|
|
164
|
+
// 🚨 MODIFIED: Passing urlParams.secret
|
|
165
|
+
await postWebhook(urlParams.push_url, verificationState, urlParams.secret, 5000);
|
|
151
166
|
}
|
|
152
167
|
}
|
|
153
168
|
catch (err) {
|
|
@@ -155,17 +170,12 @@ export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave }) {
|
|
|
155
170
|
}
|
|
156
171
|
}
|
|
157
172
|
setIsAnalyzing(false);
|
|
158
|
-
// Always redirect the user back to your main app/website, regardless of webhook success/block
|
|
159
173
|
redirectToReturnUrl({
|
|
160
174
|
status: data?.verification?.status === 'failed' ? 'error' : 'completed',
|
|
161
175
|
kyc_id: data?.session?.session_id || urlParams.kyc_id,
|
|
162
176
|
message: 'KYC process concluded',
|
|
163
177
|
processing_state: isStillProcessing ? 'analyzing' : 'completed',
|
|
164
|
-
verification_steps: {
|
|
165
|
-
document_analyzed: true,
|
|
166
|
-
selfie_analyzed: true,
|
|
167
|
-
liveness_checked: true
|
|
168
|
-
},
|
|
178
|
+
verification_steps: { document_analyzed: true, selfie_analyzed: true, liveness_checked: true },
|
|
169
179
|
});
|
|
170
180
|
onComplete?.(data);
|
|
171
181
|
}, [redirectToReturnUrl, urlParams, onComplete]);
|
|
@@ -179,7 +189,8 @@ export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave }) {
|
|
|
179
189
|
setIsAnalyzing(false);
|
|
180
190
|
if (urlParams.push_url) {
|
|
181
191
|
try {
|
|
182
|
-
|
|
192
|
+
// 🚨 MODIFIED: Passing urlParams.secret
|
|
193
|
+
await postWebhook(urlParams.push_url, { status: 'cancelled', result: null, reference_id: urlParams.reference_id }, urlParams.secret, 5000);
|
|
183
194
|
}
|
|
184
195
|
catch (err) {
|
|
185
196
|
console.warn('Failed to push data to webhook URL:', err);
|
|
@@ -187,18 +198,19 @@ export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave }) {
|
|
|
187
198
|
}
|
|
188
199
|
redirectToReturnUrl({ status: 'cancelled', kyc_id: urlParams.kyc_id, message: 'KYC process was cancelled', processing_state: 'pending' });
|
|
189
200
|
onCancel?.();
|
|
190
|
-
}, [redirectToReturnUrl, urlParams.kyc_id, urlParams.push_url, urlParams.reference_id, onCancel]);
|
|
201
|
+
}, [redirectToReturnUrl, urlParams.kyc_id, urlParams.push_url, urlParams.reference_id, urlParams.secret, onCancel]);
|
|
191
202
|
const handleSessionSave = useCallback(async (sessionId) => {
|
|
192
203
|
if (urlParams.save_session_url) {
|
|
193
204
|
try {
|
|
194
|
-
|
|
205
|
+
// 🚨 MODIFIED: Passing urlParams.secret
|
|
206
|
+
await postWebhook(urlParams.save_session_url, { status: 'session_created', reference_id: urlParams.reference_id, result: { session_id: sessionId, kyc_id: sessionId } }, urlParams.secret, 5000);
|
|
195
207
|
}
|
|
196
208
|
catch (err) {
|
|
197
209
|
console.warn('Failed to push session data:', err);
|
|
198
210
|
}
|
|
199
211
|
}
|
|
200
212
|
onSessionSave?.(sessionId);
|
|
201
|
-
}, [urlParams.save_session_url, urlParams.reference_id, onSessionSave]);
|
|
213
|
+
}, [urlParams.save_session_url, urlParams.reference_id, urlParams.secret, onSessionSave]);
|
|
202
214
|
useEffect(() => {
|
|
203
215
|
try {
|
|
204
216
|
const params = parseUrlParams();
|
|
@@ -228,14 +240,20 @@ export function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave }) {
|
|
|
228
240
|
<Text style={styles.analyzingSubtext}>This may take a few moments</Text>
|
|
229
241
|
</View>
|
|
230
242
|
</View>)}
|
|
231
|
-
|
|
232
|
-
|
|
243
|
+
{/* Overlay UI unchanged */}
|
|
244
|
+
<TemplateKYCExample
|
|
245
|
+
// ...Props unchanged...
|
|
246
|
+
onComplete={handleComplete} onCancel={handleCancel} onError={handleError} language={urlParams.lang || 'en'} API_KEY={urlParams.token} templateId={urlParams.template_id} env={urlParams.env || 'PRODUCTION'} serverEnv={urlParams.server_env} existingSessionId={urlParams.kyc_id} initialComponentIndex={(() => {
|
|
233
247
|
const raw = urlParams.component_index ?? urlParams.step;
|
|
234
248
|
if (raw == null || raw === '')
|
|
235
249
|
return undefined;
|
|
236
250
|
const index = parseInt(raw, 10);
|
|
237
251
|
return Number.isNaN(index) ? undefined : index;
|
|
238
|
-
})()} initialCountryResume={urlParams.country && urlParams.document_type ? {
|
|
252
|
+
})()} initialCountryResume={urlParams.country && urlParams.document_type ? {
|
|
253
|
+
code: urlParams.country,
|
|
254
|
+
documentType: urlParams.document_type,
|
|
255
|
+
region: urlParams.region || undefined
|
|
256
|
+
} : undefined} referenceId={urlParams.reference_id} onSessionSave={handleSessionSave}/>
|
|
239
257
|
</SafeAreaView>);
|
|
240
258
|
}
|
|
241
259
|
const styles = StyleSheet.create({
|