@sanctum-key/react-native-sdk 1.0.9 → 1.0.11

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.
Files changed (180) hide show
  1. package/README.md +3 -3
  2. package/android/build/.transforms/{c9d62bb333688ab562f51958998d5a48 → 9e34a0354bf8964d60c4c1392f5aa5b2}/transformed/classes/classes_dex/classes.dex +0 -0
  3. package/android/build/generated/source/buildConfig/debug/kyc/{SanctumKey → sanctumkey}/com/BuildConfig.java +2 -2
  4. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +1 -1
  5. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +1 -1
  6. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  7. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  8. package/android/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/xml_file_paths.xml.flat +0 -0
  9. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +2 -2
  10. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +1 -1
  11. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +1 -1
  12. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +1 -1
  13. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +1 -1
  14. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/kyc/{SanctumKey → sanctumkey}/com/BuildConfig.class +0 -0
  15. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +42 -42
  16. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +1 -1
  17. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  18. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +1 -1
  19. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  20. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  21. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  22. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  23. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  24. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  25. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  26. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  27. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  28. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  29. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  30. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  31. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  32. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  33. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  34. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  35. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  36. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  37. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  38. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  39. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  40. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  41. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  42. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  43. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  44. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  45. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  46. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  47. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  48. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  49. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  50. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  51. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  52. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  53. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  54. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  55. package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  56. package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  57. package/android/build/outputs/logs/manifest-merger-debug-report.txt +52 -52
  58. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  59. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$1$5$1.class +0 -0
  60. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$1$5$2.class +0 -0
  61. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$1.class +0 -0
  62. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$2.class +0 -0
  63. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$3.class +0 -0
  64. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$4.class +0 -0
  65. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$5.class +0 -0
  66. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunction$6.class +0 -0
  67. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$1.class +0 -0
  68. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$2.class +0 -0
  69. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$3.class +0 -0
  70. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$$inlined$AsyncFunctionWithPromise$4.class +0 -0
  71. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$$inlined$View$1.class +0 -0
  72. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$lambda$4$$inlined$Prop$1.class +0 -0
  73. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule$definition$lambda$5$lambda$4$$inlined$Prop$2.class +0 -0
  74. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkModule.class +0 -0
  75. package/android/build/tmp/kotlin-classes/debug/kyc/{SanctumKey → sanctumkey}/com/SanctumKeySdkView.class +0 -0
  76. package/android/build.gradle +2 -2
  77. package/android/src/main/AndroidManifest.xml +1 -1
  78. package/android/src/main/java/kyc/{transfergratis/com/TransfergratisSdkModule.kt → sanctumkey/com/SanctumKeySdkModule.kt} +21 -18
  79. package/android/src/main/java/kyc/{transfergratis/com/TransfergratisSdkView.kt → sanctumkey/com/SanctumKeySdkView.kt} +2 -2
  80. package/build/package.json +5 -5
  81. package/build/src/App.d.ts +2 -2
  82. package/build/src/App.d.ts.map +1 -1
  83. package/build/src/App.js +2 -2
  84. package/build/src/App.js.map +1 -1
  85. package/build/src/{TransfergratisSdk.types.d.ts → SanctumKeySdk.types.d.ts} +3 -3
  86. package/build/src/SanctumKeySdk.types.d.ts.map +1 -0
  87. package/build/src/SanctumKeySdk.types.js +2 -0
  88. package/build/src/SanctumKeySdk.types.js.map +1 -0
  89. package/build/src/{TransfergratisSdkModule.d.ts → SanctumKeySdkModule.d.ts} +4 -4
  90. package/build/src/SanctumKeySdkModule.d.ts.map +1 -0
  91. package/build/src/{TransfergratisSdkModule.js → SanctumKeySdkModule.js} +2 -2
  92. package/build/src/SanctumKeySdkModule.js.map +1 -0
  93. package/build/src/{TransfergratisSdkModule.web.d.ts → SanctumKeySdkModule.web.d.ts} +4 -4
  94. package/build/src/SanctumKeySdkModule.web.d.ts.map +1 -0
  95. package/build/src/{TransfergratisSdkModule.web.js → SanctumKeySdkModule.web.js} +3 -3
  96. package/build/src/SanctumKeySdkModule.web.js.map +1 -0
  97. package/build/src/SanctumKeySdkView.d.ts +4 -0
  98. package/build/src/SanctumKeySdkView.d.ts.map +1 -0
  99. package/build/src/SanctumKeySdkView.js +7 -0
  100. package/build/src/SanctumKeySdkView.js.map +1 -0
  101. package/build/src/SanctumKeySdkView.web.d.ts +4 -0
  102. package/build/src/SanctumKeySdkView.web.d.ts.map +1 -0
  103. package/build/src/{TransfergratisSdkView.web.js → SanctumKeySdkView.web.js} +2 -2
  104. package/build/src/SanctumKeySdkView.web.js.map +1 -0
  105. package/build/src/components/KYCElements/CountrySelection.d.ts.map +1 -1
  106. package/build/src/components/KYCElements/CountrySelection.js +259 -63
  107. package/build/src/components/KYCElements/CountrySelection.js.map +1 -1
  108. package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
  109. package/build/src/components/KYCElements/IDCardCapture.js +231 -69
  110. package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
  111. package/build/src/components/KYCElements/PhoneVerificationTemplate.d.ts.map +1 -1
  112. package/build/src/components/KYCElements/PhoneVerificationTemplate.js +160 -21
  113. package/build/src/components/KYCElements/PhoneVerificationTemplate.js.map +1 -1
  114. package/build/src/components/NativeCameraView.js +1 -1
  115. package/build/src/components/NativeCameraView.js.map +1 -1
  116. package/build/src/components/TemplateKYCExample.d.ts +4 -3
  117. package/build/src/components/TemplateKYCExample.d.ts.map +1 -1
  118. package/build/src/components/TemplateKYCExample.js +2 -2
  119. package/build/src/components/TemplateKYCExample.js.map +1 -1
  120. package/build/src/config/allowedDomains.js +6 -6
  121. package/build/src/config/allowedDomains.js.map +1 -1
  122. package/build/src/config/region_mapping.json +727 -0
  123. package/build/src/index.d.ts +3 -3
  124. package/build/src/index.d.ts.map +1 -1
  125. package/build/src/index.js +3 -3
  126. package/build/src/index.js.map +1 -1
  127. package/build/src/modules/api/CardAuthentification.d.ts.map +1 -1
  128. package/build/src/modules/api/CardAuthentification.js +3 -7
  129. package/build/src/modules/api/CardAuthentification.js.map +1 -1
  130. package/build/src/modules/api/KYCService.d.ts +1 -2
  131. package/build/src/modules/api/KYCService.d.ts.map +1 -1
  132. package/build/src/modules/api/KYCService.js +112 -60
  133. package/build/src/modules/api/KYCService.js.map +1 -1
  134. package/build/src/modules/camera/NativeCameraModule.js +17 -17
  135. package/build/src/modules/camera/NativeCameraModule.js.map +1 -1
  136. package/build/src/web/WebKYCEntry.d.ts +2 -2
  137. package/build/src/web/WebKYCEntry.d.ts.map +1 -1
  138. package/build/src/web/WebKYCEntry.js +3 -2
  139. package/build/src/web/WebKYCEntry.js.map +1 -1
  140. package/expo-module.config.json +3 -3
  141. package/ios/TransfergratisSdk.podspec +2 -2
  142. package/ios/TransfergratisSdkModule.swift +12 -12
  143. package/package.json +5 -5
  144. package/src/App.tsx +2 -2
  145. package/src/{TransfergratisSdk.types.ts → SanctumKeySdk.types.ts} +2 -2
  146. package/src/{TransfergratisSdkModule.ts → SanctumKeySdkModule.ts} +3 -3
  147. package/src/{TransfergratisSdkModule.web.ts → SanctumKeySdkModule.web.ts} +3 -3
  148. package/src/SanctumKeySdkView.tsx +11 -0
  149. package/src/{TransfergratisSdkView.web.tsx → SanctumKeySdkView.web.tsx} +2 -2
  150. package/src/components/KYCElements/CountrySelection.tsx +300 -74
  151. package/src/components/KYCElements/IDCardCapture.tsx +322 -157
  152. package/src/components/KYCElements/PhoneVerificationTemplate.tsx +201 -29
  153. package/src/components/NativeCameraView.tsx +1 -1
  154. package/src/components/TemplateKYCExample.tsx +23 -4
  155. package/src/config/allowedDomains.ts +6 -6
  156. package/src/i18n/README.md +1 -1
  157. package/src/index.ts +3 -3
  158. package/src/modules/api/CardAuthentification.ts +5 -8
  159. package/src/modules/api/KYCService.ts +174 -106
  160. package/src/modules/camera/NativeCameraModule.ts +17 -17
  161. package/src/web/WebKYCEntry.tsx +3 -3
  162. package/android/build/.transforms/ab90740579f5bd05b27b4343ada2d1c9/transformed/classes/classes_dex/classes.dex +0 -0
  163. package/android/build/.transforms/c9d62bb333688ab562f51958998d5a48/results.bin +0 -1
  164. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/BuildConfig.class.uniqueId0 +0 -0
  165. package/build/src/TransfergratisSdk.types.d.ts.map +0 -1
  166. package/build/src/TransfergratisSdk.types.js +0 -2
  167. package/build/src/TransfergratisSdk.types.js.map +0 -1
  168. package/build/src/TransfergratisSdkModule.d.ts.map +0 -1
  169. package/build/src/TransfergratisSdkModule.js.map +0 -1
  170. package/build/src/TransfergratisSdkModule.web.d.ts.map +0 -1
  171. package/build/src/TransfergratisSdkModule.web.js.map +0 -1
  172. package/build/src/TransfergratisSdkView.d.ts +0 -4
  173. package/build/src/TransfergratisSdkView.d.ts.map +0 -1
  174. package/build/src/TransfergratisSdkView.js +0 -7
  175. package/build/src/TransfergratisSdkView.js.map +0 -1
  176. package/build/src/TransfergratisSdkView.web.d.ts +0 -4
  177. package/build/src/TransfergratisSdkView.web.d.ts.map +0 -1
  178. package/build/src/TransfergratisSdkView.web.js.map +0 -1
  179. package/src/TransfergratisSdkView.tsx +0 -11
  180. /package/android/build/.transforms/{ab90740579f5bd05b27b4343ada2d1c9 → 9e34a0354bf8964d60c4c1392f5aa5b2}/results.bin +0 -0
@@ -1,8 +1,8 @@
1
- export * from './TransfergratisSdk.types';
1
+ export * from './SanctumKeySdk.types';
2
2
  export * from './types/KYC.types';
3
3
  export * from './types/env.types';
4
- export { TemplateKYCExample as LaunchTransferGratisKYC } from './components/TemplateKYCExample';
5
- export { TemplateKYCExample as LauchTransferGratisKYC } from './components/TemplateKYCExample';
4
+ export { TemplateKYCExample as LaunchSanctumKeyKYC } from './components/TemplateKYCExample';
5
+ export { TemplateKYCExample as LauchSanctumKeyKYC } from './components/TemplateKYCExample';
6
6
  export { TemplateKYCFlow } from './components/TemplateKYCFlowRefactored';
7
7
  export { default as templateService } from './modules/api/TemplateService';
8
8
  export { transformBackendTemplateToSDK, validateTransformedTemplate } from './utils/template-transformer';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAI1C,cAAc,mBAAmB,CAAC;AAGlC,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,IAAI,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAEhG,OAAO,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAG/F,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAGzE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AAItC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,IAAI,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE5F,OAAO,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAG3F,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAGzE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC"}
@@ -1,11 +1,11 @@
1
- export * from './TransfergratisSdk.types';
1
+ export * from './SanctumKeySdk.types';
2
2
  // Export KYC types
3
3
  export * from './types/KYC.types';
4
4
  // Export Environment types
5
5
  export * from './types/env.types';
6
- export { TemplateKYCExample as LaunchTransferGratisKYC } from './components/TemplateKYCExample';
6
+ export { TemplateKYCExample as LaunchSanctumKeyKYC } from './components/TemplateKYCExample';
7
7
  // Backward compatibility for existing integrations using the typo.
8
- export { TemplateKYCExample as LauchTransferGratisKYC } from './components/TemplateKYCExample';
8
+ export { TemplateKYCExample as LauchSanctumKeyKYC } from './components/TemplateKYCExample';
9
9
  // Export Template Flow Components
10
10
  export { TemplateKYCFlow } from './components/TemplateKYCFlowRefactored';
11
11
  // Export Template Service and Utilities
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAG1C,mBAAmB;AACnB,cAAc,mBAAmB,CAAC;AAElC,2BAA2B;AAC3B,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,IAAI,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAChG,mEAAmE;AACnE,OAAO,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAE/F,kCAAkC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAEzE,wCAAwC;AACxC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,6BAA6B;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,4BAA4B;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC","sourcesContent":["export * from './TransfergratisSdk.types';\n\n\n// Export KYC types\nexport * from './types/KYC.types';\n\n// Export Environment types\nexport * from './types/env.types';\n\n\nexport { TemplateKYCExample as LaunchTransferGratisKYC } from './components/TemplateKYCExample';\n// Backward compatibility for existing integrations using the typo.\nexport { TemplateKYCExample as LauchTransferGratisKYC } from './components/TemplateKYCExample';\n\n// Export Template Flow Components\nexport { TemplateKYCFlow } from './components/TemplateKYCFlowRefactored';\n\n// Export Template Service and Utilities\nexport { default as templateService } from './modules/api/TemplateService';\nexport { transformBackendTemplateToSDK, validateTransformedTemplate } from './utils/template-transformer';\nexport { useTemplateLoader } from './hooks/useTemplateLoader';\n\n// Export Template Components\nexport { WelcomeTemplate } from './components/KYCElements/WelcomeTemplate';\nexport { EnhancedCameraView } from './components/EnhancedCameraView';\nexport { UnifiedCameraModule } from './modules/camera';\n\n// Export Web KYC Components\nexport { WebKYCEntry } from './web';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AAGtC,mBAAmB;AACnB,cAAc,mBAAmB,CAAC;AAElC,2BAA2B;AAC3B,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,IAAI,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC5F,mEAAmE;AACnE,OAAO,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE3F,kCAAkC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAEzE,wCAAwC;AACxC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,6BAA6B;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,4BAA4B;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC","sourcesContent":["export * from './SanctumKeySdk.types';\n\n\n// Export KYC types\nexport * from './types/KYC.types';\n\n// Export Environment types\nexport * from './types/env.types';\n\n\nexport { TemplateKYCExample as LaunchSanctumKeyKYC } from './components/TemplateKYCExample';\n// Backward compatibility for existing integrations using the typo.\nexport { TemplateKYCExample as LauchSanctumKeyKYC } from './components/TemplateKYCExample';\n\n// Export Template Flow Components\nexport { TemplateKYCFlow } from './components/TemplateKYCFlowRefactored';\n\n// Export Template Service and Utilities\nexport { default as templateService } from './modules/api/TemplateService';\nexport { transformBackendTemplateToSDK, validateTransformedTemplate } from './utils/template-transformer';\nexport { useTemplateLoader } from './hooks/useTemplateLoader';\n\n// Export Template Components\nexport { WelcomeTemplate } from './components/KYCElements/WelcomeTemplate';\nexport { EnhancedCameraView } from './components/EnhancedCameraView';\nexport { UnifiedCameraModule } from './modules/camera';\n\n// Export Web KYC Components\nexport { WebKYCEntry } from './web';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"CardAuthentification.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/CardAuthentification.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,UAAU,WAAW;IACjB,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,UAAU,uBAAuB;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AA8CD,wBAAsB,iBAAiB,CACnC,MAAM,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB,EACD,GAAG,GAAE,cAA6B;;;;;;;;;;;;;;;;;;;;;;;;aA/DzB,OAAO;cACN,OAAO;aACR,GAAG,EAAE;eACH,WAAW,EAAE,GAAG,GAAG;oBACd,MAAM;YACd,GAAG;GAqLd;AAID,wBAAsB,gBAAgB,CAClC,MAAM,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,uBAAuB,CAAA;CAC7C,EACD,GAAG,GAAE,cAA6B,gBA0LrC;AAED,wBAAsB,iBAAiB,CACnC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC9E,GAAG,GAAE,cAA6B,gBAiFrC"}
1
+ {"version":3,"file":"CardAuthentification.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/CardAuthentification.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,UAAU,WAAW;IACjB,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,UAAU,uBAAuB;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AA8CD,wBAAsB,iBAAiB,CACnC,MAAM,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB,EACD,GAAG,GAAE,cAA6B;;;;;;;;;;;;;;;;;;;;;;;;aA/DzB,OAAO;cACN,OAAO;aACR,GAAG,EAAE;eACH,WAAW,EAAE,GAAG,GAAG;oBACd,MAAM;YACd,GAAG;GAmLd;AAGD,wBAAsB,gBAAgB,CAClC,MAAM,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,uBAAuB,CAAA;CAC7C,EACD,GAAG,GAAE,cAA6B,gBA0LrC;AAED,wBAAsB,iBAAiB,CACnC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC9E,GAAG,GAAE,cAA6B,gBAiFrC"}
@@ -36,7 +36,6 @@ export async function frontVerification(result, env = 'PRODUCTION') {
36
36
  try {
37
37
  console.log("Front verification START", JSON.stringify({ result }, null, 2));
38
38
  logger.log("Front verification", JSON.stringify({ result }, null, 2));
39
- // 🚨 FIX 1: Bulletproof Case-Insensitive Check
40
39
  const authMethods = Array.isArray(result.regionMapping?.authMethod)
41
40
  ? result.regionMapping.authMethod.map(m => String(m).toUpperCase())
42
41
  : [];
@@ -105,7 +104,6 @@ export async function frontVerification(result, env = 'PRODUCTION') {
105
104
  bbox = crop.bbox;
106
105
  }
107
106
  catch { }
108
- // 🚨 FIX 2: Execute MRZ if required (Removed restrictive guards)
109
107
  if (hasMrz) {
110
108
  try {
111
109
  logger.log("Tentative d'extraction MRZ (Front)");
@@ -116,7 +114,7 @@ export async function frontVerification(result, env = 'PRODUCTION') {
116
114
  postfix: result?.currentSide || 'front',
117
115
  token: token,
118
116
  template_path: result?.templatePath || '',
119
- mrz_type: result?.mrzType || 'TD1' // Fallback to ensure it always runs
117
+ mrz_type: result?.mrzType || 'TD1'
120
118
  }, env);
121
119
  mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;
122
120
  if (mrz?.parsed_data?.status === 'FAILURE' || mrz?.success === false) {
@@ -136,13 +134,12 @@ export async function frontVerification(result, env = 'PRODUCTION') {
136
134
  throw new Error(e?.message || 'Erreur de détection du visage');
137
135
  }
138
136
  }
139
- // ─── backVerification ────────────────────────────────────────────────────────
140
137
  export async function backVerification(result, env = 'PRODUCTION') {
141
138
  try {
142
139
  if (!result.path)
143
140
  throw new Error('No path provided');
144
141
  logger.log("result.regionMapping", result.regionMapping, result.currentSide, result.code);
145
- // 🚨 FIX 3: Robust Auth Method Resolution for the Back Side
142
+ logger.log('result object', result);
146
143
  const authMethods = Array.isArray(result.regionMapping?.authMethod)
147
144
  ? result.regionMapping.authMethod.map(m => String(m).toUpperCase())
148
145
  : [];
@@ -246,7 +243,6 @@ export async function backVerification(result, env = 'PRODUCTION') {
246
243
  }
247
244
  logger.log("Framing and Country Template verified successfully. Proceeding to Data Extraction.");
248
245
  let extractionResult = {};
249
- // 🚨 FIX 4: Guaranteed MRZ Extraction Attachment
250
246
  if (hasMrz) {
251
247
  try {
252
248
  logger.log("Tentative d'extraction MRZ (Back)");
@@ -375,7 +371,7 @@ export async function checkTemplateType(result, env = 'PRODUCTION') {
375
371
  return templateType;
376
372
  }
377
373
  catch (e) {
378
- logger.error('Error checking template type:', JSON.stringify(errorMessage(e), null, 2));
374
+ logger.error('Errorrr checking template type:', JSON.stringify(errorMessage(e), null, 2));
379
375
  if (e?.message === 'CARD_NOT_FULLY_IN_FRAME' || e?.message === 'TOO_FAR_AWAY' || e?.message?.includes('ne correspond pas'))
380
376
  throw e;
381
377
  throw new Error(e?.message || 'Erreur de vérification du template');
@@ -1 +1 @@
1
- {"version":3,"file":"CardAuthentification.js","sourceRoot":"","sources":["../../../../src/modules/api/CardAuthentification.ts"],"names":[],"mappings":"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","sourcesContent":["import kycService, { authentification, errorMessage, truncateFields } from \"./KYCService\";\nimport { cropByObb, getObbConfidence, OBB_CONFIDENCE_THRESHOLD } from \"../../utils/cropByObb\";\nimport { GovernmentDocumentType, IBbox } from \"../../types/KYC.types\";\nimport { KycEnvironment } from \"../../types/env.types\";\nimport { logger } from \"../../utils/logger\";\nimport { countryData } from \"../../config/countriesData\";\n\ninterface CardObbData {\n obb: number[][];\n confidence: number;\n card_in_frame?: boolean;\n cropped_sides?: string[];\n}\n\ninterface ApiVerificationResponse {\n result?: boolean;\n success?: boolean;\n detail?: any[];\n card_obb?: CardObbData[] | any;\n template_path?: string;\n Error?: any;\n [key: string]: any;\n}\n\nfunction getDistance(p1: number[], p2: number[]): number {\n return Math.sqrt(Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2));\n}\n\nfunction getPolygonArea(points: number[][]): number {\n const n = points.length;\n let area = 0;\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n;\n area += points[i][0] * points[j][1];\n area -= points[j][0] * points[i][1];\n }\n return Math.abs(area) / 2;\n}\n\nfunction assertCardNotTooFar(points: number[][]): void {\n if (!points || points.length < 3) return;\n\n const longestCardEdge = Math.max(\n getDistance(points[0], points[1]),\n getDistance(points[1], points[2]),\n getDistance(points[2], points[3] ?? points[0]),\n );\n\n const cardArea = getPolygonArea(points);\n\n logger.log(\n `Card distance check – longest edge: ${Math.round(longestCardEdge)} px, ` +\n `OBB area: ${Math.round(cardArea)} px²`\n );\n\n if (longestCardEdge < 700) {\n logger.log(`🛑 Rejected: longest edge too short (${Math.round(longestCardEdge)} px < 700 px)`);\n throw new Error('TOO_FAR_AWAY');\n }\n\n if (cardArea < 400_000) {\n logger.log(`🛑 Rejected: card area too small (${Math.round(cardArea)} px² < 400 000 px²)`);\n throw new Error('TOO_FAR_AWAY');\n }\n}\n\n// ─── frontVerification ────────────────────────────────────────────────────────\n\nexport async function frontVerification(\n result: {\n path?: string,\n regionMapping: { authMethod: string[], mrzTypes: string[] },\n selectedDocumentType: string,\n code: string,\n currentSide: string,\n templatePath?: string,\n mrzType?: string\n },\n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n console.log(\"Front verification START\", JSON.stringify({ result }, null, 2));\n logger.log(\"Front verification\", JSON.stringify({ result }, null, 2));\n\n // 🚨 FIX 1: Bulletproof Case-Insensitive Check\n const authMethods = Array.isArray(result.regionMapping?.authMethod) \n ? result.regionMapping.authMethod.map(m => String(m).toUpperCase()) \n : [];\n const hasMrz = authMethods.some(m => m.includes('MRZ'));\n\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI verification for front document\");\n const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n const mockResponse = {\n result: true,\n detail: [{ confidence: 0.95 }],\n card_obb: [{\n obb: [[400, 800], [2600, 800], [2600, 2200], [400, 2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }],\n bbox: mockBbox,\n ...(hasMrz ? {\n mrz: {\n success: true,\n parsed_data: {\n status: 'SUCCESS',\n document_type: result.selectedDocumentType,\n mrz_type: result.mrzType || 'TD1'\n }\n }\n } : {})\n };\n return mockResponse;\n }\n\n const token = await authentification();\n const detected = await kycService.detectFaceOnId(\n result?.path || '', token, result?.selectedDocumentType || '', env\n ) as ApiVerificationResponse;\n\n if (!detected.result) {\n throw new Error('Aucun visage détecté sur la carte. Veuillez reprendre.');\n }\n\n const cardData = detected.card_obb && Array.isArray(detected.card_obb) && detected.card_obb.length > 0\n ? detected.card_obb[0]\n : null;\n\n let points: number[][] | null = null;\n let isCardInFrame = true;\n let hasCroppedSides = false;\n\n if (cardData) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n }\n\n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Front Framing failed. Cropped sides detected.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n if (points && points.length >= 3) {\n assertCardNotTooFar(points);\n }\n\n const obbConfidence = getObbConfidence(detected.card_obb);\n if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {\n throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n }\n\n let croppedBase64: string | undefined;\n let bbox: IBbox | undefined;\n let mrz: any | undefined;\n\n try {\n const crop = await cropByObb(result?.path || '', detected.card_obb);\n croppedBase64 = crop.base64;\n bbox = crop.bbox;\n } catch { }\n\n // 🚨 FIX 2: Execute MRZ if required (Removed restrictive guards)\n if (hasMrz) {\n try {\n logger.log(\"Tentative d'extraction MRZ (Front)\");\n const mrzResponse = await kycService.extractMrzText(\n {\n fileUri: result.path || '',\n docType: result?.selectedDocumentType || '',\n docRegion: result?.code || \"\",\n postfix: result?.currentSide || 'front',\n token: token,\n template_path: result?.templatePath || '',\n mrz_type: result?.mrzType || 'TD1' // Fallback to ensure it always runs\n },\n env\n );\n \n mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;\n\n if (mrz?.parsed_data?.status === 'FAILURE' || mrz?.success === false) {\n logger.log(\"🛑 Front MRZ Extraction Failed:\", mrz?.parsed_data?.status_message);\n throw new Error(`MRZ illisible: ${mrz?.parsed_data?.status_message || 'Veuillez nettoyer l\\'objectif et réessayer'}`);\n }\n } catch (err: any) {\n logger.error(\"MRZ Extraction Error:\", err);\n throw new Error(err?.message || \"Erreur lors de l'extraction MRZ. Veuillez reprendre la photo.\");\n }\n }\n\n return { ...detected, croppedBase64, bbox, ...(mrz ? { mrz } : {}) };\n\n } catch (e: any) {\n logger.error('Error front verification:', e?.message);\n throw new Error(e?.message || 'Erreur de détection du visage');\n }\n}\n\n// ─── backVerification ────────────────────────────────────────────────────────\n\nexport async function backVerification(\n result: {\n path?: string,\n regionMapping: { authMethod: string[], mrzTypes: string[] },\n selectedDocumentType: string,\n code: string,\n currentSide: string,\n templatePath?: string,\n mrzType?: string,\n templateResponse?: ApiVerificationResponse\n },\n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n if (!result.path) throw new Error('No path provided');\n logger.log(\"result.regionMapping\", result.regionMapping, result.currentSide, result.code);\n\n // 🚨 FIX 3: Robust Auth Method Resolution for the Back Side\n const authMethods = Array.isArray(result.regionMapping?.authMethod) \n ? result.regionMapping.authMethod.map(m => String(m).toUpperCase()) \n : [];\n const hasMrz = authMethods.some(m => m.includes('MRZ'));\n const hasBarcode = authMethods.some(m => m.includes('BARCODE') || m.includes('2D'));\n\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI verification for back document\");\n const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n const mockCardObb = [{\n obb: [[400, 800], [2600, 800], [2600, 2200], [400, 2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }];\n\n if (hasMrz) {\n return {\n success: true,\n mrz: {\n success: true,\n parsed_data: {\n status: 'SUCCESS',\n document_type: result.selectedDocumentType,\n mrz_type: result.mrzType || 'TD1'\n }\n },\n bbox: mockBbox,\n card_obb: mockCardObb\n };\n } else if (hasBarcode) {\n return {\n success: true,\n barcode: { barcode_data: 'SANDBOX_MOCK_BARCODE' },\n bbox: mockBbox,\n card_obb: mockCardObb\n };\n }\n return { success: true, bbox: mockBbox, card_obb: mockCardObb };\n }\n\n const token = await authentification();\n logger.log(\"1. Checking template and framing for back document...\");\n\n const templateResponse: ApiVerificationResponse = result.templateResponse ||\n await kycService.checkTemplateType({\n fileUri: result.path,\n docType: result.selectedDocumentType as any,\n docRegion: result.code,\n postfix: 'back',\n token: token\n }, env);\n\n if (templateResponse.success === false || templateResponse.Error) {\n throw new Error('Impossible de lire le document. Veuillez vous rapprocher et stabiliser la caméra.');\n }\n\n const cardData = templateResponse?.card_obb && Array.isArray(templateResponse.card_obb) && templateResponse.card_obb.length > 0\n ? templateResponse.card_obb[0]\n : null;\n\n if (!cardData) throw new Error('CARD_NOT_FULLY_IN_FRAME');\n\n let points: number[][] | null = null;\n let isCardInFrame = false;\n let hasCroppedSides = true;\n\n if (cardData.obb) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n } else if (Array.isArray(cardData) && Array.isArray(cardData[0])) {\n points = cardData[0];\n isCardInFrame = true;\n hasCroppedSides = false;\n if (points && points.length === 4) {\n const minX = Math.min(...points.map((p: number[]) => p[0]));\n const minY = Math.min(...points.map((p: number[]) => p[1]));\n if (minX <= 15 || minY <= 15) {\n isCardInFrame = false;\n hasCroppedSides = true;\n }\n }\n }\n\n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Back Framing failed. Coordinates hit image boundary.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n if (points && points.length >= 3) {\n assertCardNotTooFar(points);\n }\n\n const obbConf = getObbConfidence(templateResponse?.card_obb);\n if (obbConf !== null && obbConf < OBB_CONFIDENCE_THRESHOLD) {\n throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n }\n\n const activeTemplatePath = templateResponse.template_path || result.templatePath || '';\n if (activeTemplatePath) {\n const expectedCountryName = countryData[result.code]?.name_en || '';\n const hasCodeMatch = activeTemplatePath.includes(`_${result.code}_`);\n const hasNameMatch = expectedCountryName && activeTemplatePath.toLowerCase().includes(expectedCountryName.toLowerCase());\n\n if (!hasCodeMatch && !hasNameMatch) {\n logger.log(`Template mismatch! Expected: ${result.code} (${expectedCountryName}), Detected: ${activeTemplatePath}`);\n throw new Error(`Le document ne correspond pas au pays sélectionné (${result.code}).`);\n }\n }\n\n logger.log(\"Framing and Country Template verified successfully. Proceeding to Data Extraction.\");\n\n let extractionResult: any = {};\n\n // 🚨 FIX 4: Guaranteed MRZ Extraction Attachment\n if (hasMrz) {\n try {\n logger.log(\"Tentative d'extraction MRZ (Back)\");\n const mrzResponse = await kycService.extractMrzText({\n fileUri: result.path!,\n docType: result?.selectedDocumentType || '',\n docRegion: result?.code || '',\n postfix: result?.currentSide || 'back',\n token: token,\n template_path: activeTemplatePath,\n mrz_type: result?.mrzType || 'TD1'\n }, env);\n\n const mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;\n\n if (mrz?.parsed_data?.status === 'FAILURE' || mrz?.success === false) {\n throw new Error(mrz?.parsed_data?.status_message || 'Lecture MRZ échouée');\n }\n \n extractionResult.mrz = mrz; // Attaching securely to result object\n \n } catch (mrzError: any) {\n logger.log(`MRZ échoué: ${mrzError?.message}`);\n // If MRZ fails, we MUST throw an error so the user is forced to retake it!\n throw new Error(`Lecture MRZ invalide: ${mrzError?.message || 'Veuillez nettoyer l\\'objectif et réessayer'}`);\n }\n }\n\n if (hasBarcode) {\n try {\n logger.log(\"Tentative d'extraction barcode\");\n const barcode = await kycService.extractBarcode({ fileUri: result.path!, token: token }, env);\n extractionResult.barcode = barcode;\n } catch (e: any) {\n // Only throw barcode error if MRZ wasn't already successfully extracted\n if (!extractionResult.mrz) {\n throw new Error(`Lecture Barcode échouée: ${e?.message}`);\n }\n }\n }\n\n let bbox: IBbox | undefined;\n let croppedBase64: string | undefined;\n try {\n const crop = await cropByObb(result?.path || '', templateResponse.card_obb);\n bbox = crop.bbox;\n croppedBase64 = crop.base64;\n } catch { }\n\n return {\n success: true,\n ...extractionResult,\n bbox,\n croppedBase64,\n card_obb: templateResponse.card_obb\n };\n\n } catch (e: any) {\n if (e?.message === 'CARD_NOT_FULLY_IN_FRAME' || e?.message === 'TOO_FAR_AWAY') throw e;\n throw new Error(e?.message || 'Erreur de détection des données');\n }\n}\n\nexport async function checkTemplateType(\n result: { path?: string, docType: string, docRegion: string, postfix: string },\n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n if (env === 'SANDBOX') {\n return {\n template_path: `templates/${result.docType}_${result.docRegion}_${result.postfix}.jpg`,\n card_obb: [{\n obb: [[400, 800], [2600, 800], [2600, 2200], [400, 2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }]\n };\n }\n\n const token = await authentification();\n const templateType = await kycService.checkTemplateType({\n fileUri: result.path || '',\n docType: result?.docType as GovernmentDocumentType,\n docRegion: result?.docRegion || \"\",\n postfix: result?.postfix,\n token: token\n }, env);\n\n if (templateType.success === false || templateType.Error) {\n logger.log(\"Backend returned an error:\", templateType.Error);\n throw new Error('Impossible de lire le document. Veuillez vous rapprocher et stabiliser la caméra.');\n }\n\n const cardData = templateType.card_obb && Array.isArray(templateType.card_obb) && templateType.card_obb.length > 0\n ? templateType.card_obb[0]\n : null;\n\n if (!cardData) throw new Error('CARD_NOT_FULLY_IN_FRAME');\n\n let points: number[][] | null = null;\n let isCardInFrame = false;\n let hasCroppedSides = true;\n\n if (cardData.obb) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n } else if (Array.isArray(cardData) && Array.isArray(cardData[0])) {\n points = cardData[0];\n isCardInFrame = true;\n hasCroppedSides = false;\n if (points && points.length === 4) {\n const minX = Math.min(...points.map((p: number[]) => p[0]));\n const minY = Math.min(...points.map((p: number[]) => p[1]));\n if (minX <= 15 || minY <= 15) {\n isCardInFrame = false;\n hasCroppedSides = true;\n }\n }\n }\n\n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Template Framing failed.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n if (points && points.length >= 3) {\n assertCardNotTooFar(points);\n }\n\n const LPIPS_THRESHOLD = 0.75;\n if (templateType.lpips_score !== undefined && templateType.lpips_score > LPIPS_THRESHOLD) {\n logger.log(`🛑 Country Mismatch! LPIPS: ${templateType.lpips_score}`);\n throw new Error(`Le document présenté ne correspond pas au pays sélectionné (${result.docRegion}).`);\n }\n\n logger.log(\"templateType result\", JSON.stringify(truncateFields(templateType), null, 2));\n return templateType;\n } catch (e: any) {\n logger.error('Error checking template type:', JSON.stringify(errorMessage(e), null, 2));\n if (e?.message === 'CARD_NOT_FULLY_IN_FRAME' || e?.message === 'TOO_FAR_AWAY' || e?.message?.includes('ne correspond pas')) throw e;\n throw new Error(e?.message || 'Erreur de vérification du template');\n }\n}"]}
1
+ {"version":3,"file":"CardAuthentification.js","sourceRoot":"","sources":["../../../../src/modules/api/CardAuthentification.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,EAAE,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAG9F,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAmBzD,SAAS,WAAW,CAAC,EAAY,EAAE,EAAY;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB;IACtC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAkB;IAC3C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO;IAEzC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAC5B,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EACjC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EACjC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CACjD,CAAC;IAEF,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAExC,MAAM,CAAC,GAAG,CACN,uCAAuC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO;QACzE,aAAa,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAC1C,CAAC;IAEF,IAAI,eAAe,GAAG,GAAG,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,wCAAwC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QAC/F,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,QAAQ,GAAG,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,qCAAqC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;AACL,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,MAQC,EACD,MAAsB,YAAY;IAElC,IAAI,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEtE,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC;YAC/D,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACnE,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAExD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAU,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC5E,MAAM,YAAY,GAAG;gBACjB,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;gBAC9B,QAAQ,EAAE,CAAC;wBACP,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;wBACzD,UAAU,EAAE,IAAI;wBAChB,aAAa,EAAE,IAAI;wBACnB,aAAa,EAAE,EAAE;qBACpB,CAAC;gBACF,IAAI,EAAE,QAAQ;gBACd,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;oBACT,GAAG,EAAE;wBACD,OAAO,EAAE,IAAI;wBACb,WAAW,EAAE;4BACT,MAAM,EAAE,SAAS;4BACjB,aAAa,EAAE,MAAM,CAAC,oBAAoB;4BAC1C,QAAQ,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;yBACpC;qBACJ;iBACJ,CAAC,CAAC,CAAC,EAAE,CAAC;aACV,CAAC;YACF,OAAO,YAAY,CAAC;QACxB,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,cAAc,CAC5C,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,IAAI,EAAE,EAAE,GAAG,CAC1C,CAAC;QAE7B,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YAClG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtB,CAAC,CAAC,IAAI,CAAC;QAEX,IAAI,MAAM,GAAsB,IAAI,CAAC;QACrC,IAAI,aAAa,GAAG,IAAI,CAAC;QACzB,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC;YACtB,IAAI,OAAO,QAAQ,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;gBAChD,aAAa,GAAG,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC;gBAChD,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;YACjG,CAAC;QACL,CAAC;QAED,IAAI,CAAC,aAAa,IAAI,eAAe,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC/B,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,GAAG,wBAAwB,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAChG,CAAC;QAED,IAAI,aAAiC,CAAC;QACtC,IAAI,IAAuB,CAAC;QAC5B,IAAI,GAAoB,CAAC;QAEzB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpE,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;YAC5B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;QAEX,IAAI,MAAM,EAAE,CAAC;YACT,IAAI,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;gBACjD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,cAAc,CAC/C;oBACI,OAAO,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;oBAC1B,OAAO,EAAE,MAAM,EAAE,oBAAoB,IAAI,EAAE;oBAC3C,SAAS,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE;oBAC7B,OAAO,EAAE,MAAM,EAAE,WAAW,IAAI,OAAO;oBACvC,KAAK,EAAE,KAAK;oBACZ,aAAa,EAAE,MAAM,EAAE,YAAY,IAAI,EAAE;oBACzC,QAAQ,EAAE,MAAM,EAAE,OAAO,IAAI,KAAK;iBACrC,EACD,GAAG,CACN,CAAC;gBAEF,GAAG,GAAG,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;gBAE9E,IAAI,GAAG,EAAE,WAAW,EAAE,MAAM,KAAK,SAAS,IAAI,GAAG,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;oBACnE,MAAM,CAAC,GAAG,CAAC,iCAAiC,EAAE,GAAG,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;oBAChF,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,EAAE,WAAW,EAAE,cAAc,IAAI,4CAA4C,EAAE,CAAC,CAAC;gBAC1H,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,OAAO,IAAI,+DAA+D,CAAC,CAAC;YACrG,CAAC;QACL,CAAC;QAED,OAAO,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAEzE,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,CAAC,EAAE,OAAO,IAAI,+BAA+B,CAAC,CAAC;IACnE,CAAC;AACL,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAClC,MASC,EACD,MAAsB,YAAY;IAElC,IAAI,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1F,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;QAEnC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC;YAC/D,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACnE,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;QACvD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAU,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC5E,MAAM,WAAW,GAAG,CAAC;oBACjB,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACzD,UAAU,EAAE,IAAI;oBAChB,aAAa,EAAE,IAAI;oBACnB,aAAa,EAAE,EAAE;iBACpB,CAAC,CAAC;YAEH,IAAI,MAAM,EAAE,CAAC;gBACT,OAAO;oBACH,OAAO,EAAE,IAAI;oBACb,GAAG,EAAE;wBACD,OAAO,EAAE,IAAI;wBACb,WAAW,EAAE;4BACT,MAAM,EAAE,SAAS;4BACjB,aAAa,EAAE,MAAM,CAAC,oBAAoB;4BAC1C,QAAQ,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;yBACpC;qBACJ;oBACD,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,WAAW;iBACxB,CAAC;YACN,CAAC;iBAAM,IAAI,UAAU,EAAE,CAAC;gBACpB,OAAO;oBACH,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,EAAE,YAAY,EAAE,sBAAsB,EAAE;oBACjD,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,WAAW;iBACxB,CAAC;YACN,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QACpE,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QAEpE,MAAM,gBAAgB,GAA4B,MAAM,CAAC,gBAAgB;YACrE,MAAM,UAAU,CAAC,iBAAiB,CAAC;gBAC/B,OAAO,EAAE,MAAM,CAAC,IAAI;gBACpB,OAAO,EAAE,MAAM,CAAC,oBAA2B;gBAC3C,SAAS,EAAE,MAAM,CAAC,IAAI;gBACtB,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE,KAAK;aACf,EAAE,GAAG,CAAC,CAAC;QAEZ,IAAI,gBAAgB,CAAC,OAAO,KAAK,KAAK,IAAI,gBAAgB,CAAC,KAAK,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;QACzG,CAAC;QAED,MAAM,QAAQ,GAAG,gBAAgB,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YAC3H,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC;QAEX,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE1D,IAAI,MAAM,GAAsB,IAAI,CAAC;QACrC,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,eAAe,GAAG,IAAI,CAAC;QAE3B,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;YACf,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC;YACtB,IAAI,OAAO,QAAQ,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;gBAChD,aAAa,GAAG,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC;gBAChD,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;YACjG,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACrB,aAAa,GAAG,IAAI,CAAC;YACrB,eAAe,GAAG,KAAK,CAAC;YACxB,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5D,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;oBAC3B,aAAa,GAAG,KAAK,CAAC;oBACtB,eAAe,GAAG,IAAI,CAAC;gBAC3B,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,CAAC,aAAa,IAAI,eAAe,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC/B,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QAC7D,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,wBAAwB,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAChG,CAAC;QAED,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,aAAa,IAAI,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;QACvF,IAAI,kBAAkB,EAAE,CAAC;YACrB,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;YACpE,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;YACrE,MAAM,YAAY,GAAG,mBAAmB,IAAI,kBAAkB,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,CAAC;YAEzH,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC;gBACjC,MAAM,CAAC,GAAG,CAAC,gCAAgC,MAAM,CAAC,IAAI,KAAK,mBAAmB,gBAAgB,kBAAkB,EAAE,CAAC,CAAC;gBACpH,MAAM,IAAI,KAAK,CAAC,sDAAsD,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;YAC3F,CAAC;QACL,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;QAEjG,IAAI,gBAAgB,GAAQ,EAAE,CAAC;QAE/B,IAAI,MAAM,EAAE,CAAC;YACT,IAAI,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBAChD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC;oBAChD,OAAO,EAAE,MAAM,CAAC,IAAK;oBACrB,OAAO,EAAE,MAAM,EAAE,oBAAoB,IAAI,EAAE;oBAC3C,SAAS,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE;oBAC7B,OAAO,EAAE,MAAM,EAAE,WAAW,IAAI,MAAM;oBACtC,KAAK,EAAE,KAAK;oBACZ,aAAa,EAAE,kBAAkB;oBACjC,QAAQ,EAAE,MAAM,EAAE,OAAO,IAAI,KAAK;iBACrC,EAAE,GAAG,CAAC,CAAC;gBAER,MAAM,GAAG,GAAG,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;gBAEpF,IAAI,GAAG,EAAE,WAAW,EAAE,MAAM,KAAK,SAAS,IAAI,GAAG,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;oBACnE,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,cAAc,IAAI,qBAAqB,CAAC,CAAC;gBAC/E,CAAC;gBAED,gBAAgB,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,sCAAsC;YAEtE,CAAC;YAAC,OAAO,QAAa,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,eAAe,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/C,2EAA2E;gBAC3E,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,OAAO,IAAI,4CAA4C,EAAE,CAAC,CAAC;YAClH,CAAC;QACL,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACb,IAAI,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC7C,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,IAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC9F,gBAAgB,CAAC,OAAO,GAAG,OAAO,CAAC;YACvC,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,wEAAwE;gBACxE,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC;oBACxB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC9D,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,IAAuB,CAAC;QAC5B,IAAI,aAAiC,CAAC;QACtC,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC5E,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACjB,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;QAEX,OAAO;YACH,OAAO,EAAE,IAAI;YACb,GAAG,gBAAgB;YACnB,IAAI;YACJ,aAAa;YACb,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;SACtC,CAAC;IAEN,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,IAAI,CAAC,EAAE,OAAO,KAAK,yBAAyB,IAAI,CAAC,EAAE,OAAO,KAAK,cAAc;YAAE,MAAM,CAAC,CAAC;QACvF,MAAM,IAAI,KAAK,CAAC,CAAC,EAAE,OAAO,IAAI,iCAAiC,CAAC,CAAC;IACrE,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,MAA8E,EAC9E,MAAsB,YAAY;IAElC,IAAI,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO;gBACH,aAAa,EAAE,aAAa,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,MAAM;gBACtF,QAAQ,EAAE,CAAC;wBACP,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;wBACzD,UAAU,EAAE,IAAI;wBAChB,aAAa,EAAE,IAAI;wBACnB,aAAa,EAAE,EAAE;qBACpB,CAAC;aACL,CAAC;QACN,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC;YACpD,OAAO,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;YAC1B,OAAO,EAAE,MAAM,EAAE,OAAiC;YAClD,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,EAAE;YAClC,OAAO,EAAE,MAAM,EAAE,OAAO;YACxB,KAAK,EAAE,KAAK;SACf,EAAE,GAAG,CAAC,CAAC;QAER,IAAI,YAAY,CAAC,OAAO,KAAK,KAAK,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;QACzG,CAAC;QAED,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YAC9G,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC;QAEX,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE1D,IAAI,MAAM,GAAsB,IAAI,CAAC;QACrC,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,eAAe,GAAG,IAAI,CAAC;QAE3B,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;YACf,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC;YACtB,IAAI,OAAO,QAAQ,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;gBAChD,aAAa,GAAG,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC;gBAChD,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;YACjG,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACrB,aAAa,GAAG,IAAI,CAAC;YACrB,eAAe,GAAG,KAAK,CAAC;YACxB,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5D,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;oBAC3B,aAAa,GAAG,KAAK,CAAC;oBACtB,eAAe,GAAG,IAAI,CAAC;gBAC3B,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,CAAC,aAAa,IAAI,eAAe,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC/B,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC;QAC7B,IAAI,YAAY,CAAC,WAAW,KAAK,SAAS,IAAI,YAAY,CAAC,WAAW,GAAG,eAAe,EAAE,CAAC;YACvF,MAAM,CAAC,GAAG,CAAC,+BAA+B,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,+DAA+D,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;QACzG,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzF,OAAO,YAAY,CAAC;IACxB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,EAAE,OAAO,KAAK,yBAAyB,IAAI,CAAC,EAAE,OAAO,KAAK,cAAc,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC;YAAE,MAAM,CAAC,CAAC;QACpI,MAAM,IAAI,KAAK,CAAC,CAAC,EAAE,OAAO,IAAI,oCAAoC,CAAC,CAAC;IACxE,CAAC;AACL,CAAC","sourcesContent":["import kycService, { authentification, errorMessage, truncateFields } from \"./KYCService\";\nimport { cropByObb, getObbConfidence, OBB_CONFIDENCE_THRESHOLD } from \"../../utils/cropByObb\";\nimport { GovernmentDocumentType, IBbox } from \"../../types/KYC.types\";\nimport { KycEnvironment } from \"../../types/env.types\";\nimport { logger } from \"../../utils/logger\";\nimport { countryData } from \"../../config/countriesData\";\n\ninterface CardObbData {\n obb: number[][];\n confidence: number;\n card_in_frame?: boolean;\n cropped_sides?: string[];\n}\n\ninterface ApiVerificationResponse {\n result?: boolean;\n success?: boolean;\n detail?: any[];\n card_obb?: CardObbData[] | any;\n template_path?: string;\n Error?: any;\n [key: string]: any;\n}\n\nfunction getDistance(p1: number[], p2: number[]): number {\n return Math.sqrt(Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2));\n}\n\nfunction getPolygonArea(points: number[][]): number {\n const n = points.length;\n let area = 0;\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n;\n area += points[i][0] * points[j][1];\n area -= points[j][0] * points[i][1];\n }\n return Math.abs(area) / 2;\n}\n\nfunction assertCardNotTooFar(points: number[][]): void {\n if (!points || points.length < 3) return;\n\n const longestCardEdge = Math.max(\n getDistance(points[0], points[1]),\n getDistance(points[1], points[2]),\n getDistance(points[2], points[3] ?? points[0]),\n );\n\n const cardArea = getPolygonArea(points);\n\n logger.log(\n `Card distance check – longest edge: ${Math.round(longestCardEdge)} px, ` +\n `OBB area: ${Math.round(cardArea)} px²`\n );\n\n if (longestCardEdge < 700) {\n logger.log(`🛑 Rejected: longest edge too short (${Math.round(longestCardEdge)} px < 700 px)`);\n throw new Error('TOO_FAR_AWAY');\n }\n\n if (cardArea < 400_000) {\n logger.log(`🛑 Rejected: card area too small (${Math.round(cardArea)} px² < 400 000 px²)`);\n throw new Error('TOO_FAR_AWAY');\n }\n}\n\n// ─── frontVerification ────────────────────────────────────────────────────────\n\nexport async function frontVerification(\n result: {\n path?: string,\n regionMapping: { authMethod: string[], mrzTypes: string[] },\n selectedDocumentType: string,\n code: string,\n currentSide: string,\n templatePath?: string,\n mrzType?: string\n },\n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n console.log(\"Front verification START\", JSON.stringify({ result }, null, 2));\n logger.log(\"Front verification\", JSON.stringify({ result }, null, 2));\n\n const authMethods = Array.isArray(result.regionMapping?.authMethod) \n ? result.regionMapping.authMethod.map(m => String(m).toUpperCase()) \n : [];\n const hasMrz = authMethods.some(m => m.includes('MRZ'));\n\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI verification for front document\");\n const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n const mockResponse = {\n result: true,\n detail: [{ confidence: 0.95 }],\n card_obb: [{\n obb: [[400, 800], [2600, 800], [2600, 2200], [400, 2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }],\n bbox: mockBbox,\n ...(hasMrz ? {\n mrz: {\n success: true,\n parsed_data: {\n status: 'SUCCESS',\n document_type: result.selectedDocumentType,\n mrz_type: result.mrzType || 'TD1'\n }\n }\n } : {})\n };\n return mockResponse;\n }\n\n const token = await authentification();\n const detected = await kycService.detectFaceOnId(\n result?.path || '', token, result?.selectedDocumentType || '', env\n ) as ApiVerificationResponse;\n\n if (!detected.result) {\n throw new Error('Aucun visage détecté sur la carte. Veuillez reprendre.');\n }\n\n const cardData = detected.card_obb && Array.isArray(detected.card_obb) && detected.card_obb.length > 0\n ? detected.card_obb[0]\n : null;\n\n let points: number[][] | null = null;\n let isCardInFrame = true;\n let hasCroppedSides = false;\n\n if (cardData) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n }\n\n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Front Framing failed. Cropped sides detected.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n if (points && points.length >= 3) {\n assertCardNotTooFar(points);\n }\n\n const obbConfidence = getObbConfidence(detected.card_obb);\n if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {\n throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n }\n\n let croppedBase64: string | undefined;\n let bbox: IBbox | undefined;\n let mrz: any | undefined;\n\n try {\n const crop = await cropByObb(result?.path || '', detected.card_obb);\n croppedBase64 = crop.base64;\n bbox = crop.bbox;\n } catch { }\n\n if (hasMrz) {\n try {\n logger.log(\"Tentative d'extraction MRZ (Front)\");\n const mrzResponse = await kycService.extractMrzText(\n {\n fileUri: result.path || '',\n docType: result?.selectedDocumentType || '',\n docRegion: result?.code || \"\",\n postfix: result?.currentSide || 'front',\n token: token,\n template_path: result?.templatePath || '',\n mrz_type: result?.mrzType || 'TD1' \n },\n env\n );\n \n mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;\n\n if (mrz?.parsed_data?.status === 'FAILURE' || mrz?.success === false) {\n logger.log(\"🛑 Front MRZ Extraction Failed:\", mrz?.parsed_data?.status_message);\n throw new Error(`MRZ illisible: ${mrz?.parsed_data?.status_message || 'Veuillez nettoyer l\\'objectif et réessayer'}`);\n }\n } catch (err: any) {\n logger.error(\"MRZ Extraction Error:\", err);\n throw new Error(err?.message || \"Erreur lors de l'extraction MRZ. Veuillez reprendre la photo.\");\n }\n }\n\n return { ...detected, croppedBase64, bbox, ...(mrz ? { mrz } : {}) };\n\n } catch (e: any) {\n logger.error('Error front verification:', e?.message);\n throw new Error(e?.message || 'Erreur de détection du visage');\n }\n}\n\n\nexport async function backVerification(\n result: {\n path?: string,\n regionMapping: { authMethod: string[], mrzTypes: string[] },\n selectedDocumentType: string,\n code: string,\n currentSide: string,\n templatePath?: string,\n mrzType?: string,\n templateResponse?: ApiVerificationResponse\n },\n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n if (!result.path) throw new Error('No path provided');\n logger.log(\"result.regionMapping\", result.regionMapping, result.currentSide, result.code);\n logger.log('result object', result)\n\n const authMethods = Array.isArray(result.regionMapping?.authMethod) \n ? result.regionMapping.authMethod.map(m => String(m).toUpperCase()) \n : [];\n\n const hasMrz = authMethods.some(m => m.includes('MRZ'))\n const hasBarcode = authMethods.some(m => m.includes('BARCODE') || m.includes('2D'));\n\n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI verification for back document\");\n const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n const mockCardObb = [{\n obb: [[400, 800], [2600, 800], [2600, 2200], [400, 2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }];\n\n if (hasMrz) {\n return {\n success: true,\n mrz: {\n success: true,\n parsed_data: {\n status: 'SUCCESS',\n document_type: result.selectedDocumentType,\n mrz_type: result.mrzType || 'TD1'\n }\n },\n bbox: mockBbox,\n card_obb: mockCardObb\n };\n } else if (hasBarcode) {\n return {\n success: true,\n barcode: { barcode_data: 'SANDBOX_MOCK_BARCODE' },\n bbox: mockBbox,\n card_obb: mockCardObb\n };\n }\n return { success: true, bbox: mockBbox, card_obb: mockCardObb };\n }\n\n const token = await authentification();\n logger.log(\"1. Checking template and framing for back document...\");\n\n const templateResponse: ApiVerificationResponse = result.templateResponse ||\n await kycService.checkTemplateType({\n fileUri: result.path,\n docType: result.selectedDocumentType as any,\n docRegion: result.code,\n postfix: 'back',\n token: token\n }, env);\n\n if (templateResponse.success === false || templateResponse.Error) {\n throw new Error('Impossible de lire le document. Veuillez vous rapprocher et stabiliser la caméra.');\n }\n\n const cardData = templateResponse?.card_obb && Array.isArray(templateResponse.card_obb) && templateResponse.card_obb.length > 0\n ? templateResponse.card_obb[0]\n : null;\n\n if (!cardData) throw new Error('CARD_NOT_FULLY_IN_FRAME');\n\n let points: number[][] | null = null;\n let isCardInFrame = false;\n let hasCroppedSides = true;\n\n if (cardData.obb) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n } else if (Array.isArray(cardData) && Array.isArray(cardData[0])) {\n points = cardData[0];\n isCardInFrame = true;\n hasCroppedSides = false;\n if (points && points.length === 4) {\n const minX = Math.min(...points.map((p: number[]) => p[0]));\n const minY = Math.min(...points.map((p: number[]) => p[1]));\n if (minX <= 15 || minY <= 15) {\n isCardInFrame = false;\n hasCroppedSides = true;\n }\n }\n }\n\n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Back Framing failed. Coordinates hit image boundary.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n if (points && points.length >= 3) {\n assertCardNotTooFar(points);\n }\n\n const obbConf = getObbConfidence(templateResponse?.card_obb);\n if (obbConf !== null && obbConf < OBB_CONFIDENCE_THRESHOLD) {\n throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n }\n\n const activeTemplatePath = templateResponse.template_path || result.templatePath || '';\n if (activeTemplatePath) {\n const expectedCountryName = countryData[result.code]?.name_en || '';\n const hasCodeMatch = activeTemplatePath.includes(`_${result.code}_`);\n const hasNameMatch = expectedCountryName && activeTemplatePath.toLowerCase().includes(expectedCountryName.toLowerCase());\n\n if (!hasCodeMatch && !hasNameMatch) {\n logger.log(`Template mismatch! Expected: ${result.code} (${expectedCountryName}), Detected: ${activeTemplatePath}`);\n throw new Error(`Le document ne correspond pas au pays sélectionné (${result.code}).`);\n }\n }\n\n logger.log(\"Framing and Country Template verified successfully. Proceeding to Data Extraction.\");\n\n let extractionResult: any = {};\n\n if (hasMrz) {\n try {\n logger.log(\"Tentative d'extraction MRZ (Back)\");\n const mrzResponse = await kycService.extractMrzText({\n fileUri: result.path!,\n docType: result?.selectedDocumentType || '',\n docRegion: result?.code || '',\n postfix: result?.currentSide || 'back',\n token: token,\n template_path: activeTemplatePath,\n mrz_type: result?.mrzType || 'TD1'\n }, env);\n\n const mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;\n\n if (mrz?.parsed_data?.status === 'FAILURE' || mrz?.success === false) {\n throw new Error(mrz?.parsed_data?.status_message || 'Lecture MRZ échouée');\n }\n \n extractionResult.mrz = mrz; // Attaching securely to result object\n \n } catch (mrzError: any) {\n logger.log(`MRZ échoué: ${mrzError?.message}`);\n // If MRZ fails, we MUST throw an error so the user is forced to retake it!\n throw new Error(`Lecture MRZ invalide: ${mrzError?.message || 'Veuillez nettoyer l\\'objectif et réessayer'}`);\n }\n }\n\n if (hasBarcode) {\n try {\n logger.log(\"Tentative d'extraction barcode\");\n const barcode = await kycService.extractBarcode({ fileUri: result.path!, token: token }, env);\n extractionResult.barcode = barcode;\n } catch (e: any) {\n // Only throw barcode error if MRZ wasn't already successfully extracted\n if (!extractionResult.mrz) {\n throw new Error(`Lecture Barcode échouée: ${e?.message}`);\n }\n }\n }\n\n let bbox: IBbox | undefined;\n let croppedBase64: string | undefined;\n try {\n const crop = await cropByObb(result?.path || '', templateResponse.card_obb);\n bbox = crop.bbox;\n croppedBase64 = crop.base64;\n } catch { }\n\n return {\n success: true,\n ...extractionResult,\n bbox,\n croppedBase64,\n card_obb: templateResponse.card_obb\n };\n\n } catch (e: any) {\n if (e?.message === 'CARD_NOT_FULLY_IN_FRAME' || e?.message === 'TOO_FAR_AWAY') throw e;\n throw new Error(e?.message || 'Erreur de détection des données');\n }\n}\n\nexport async function checkTemplateType(\n result: { path?: string, docType: string, docRegion: string, postfix: string },\n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n if (env === 'SANDBOX') {\n return {\n template_path: `templates/${result.docType}_${result.docRegion}_${result.postfix}.jpg`,\n card_obb: [{\n obb: [[400, 800], [2600, 800], [2600, 2200], [400, 2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }]\n };\n }\n\n const token = await authentification();\n const templateType = await kycService.checkTemplateType({\n fileUri: result.path || '',\n docType: result?.docType as GovernmentDocumentType,\n docRegion: result?.docRegion || \"\",\n postfix: result?.postfix,\n token: token\n }, env);\n\n if (templateType.success === false || templateType.Error) {\n logger.log(\"Backend returned an error:\", templateType.Error);\n throw new Error('Impossible de lire le document. Veuillez vous rapprocher et stabiliser la caméra.');\n }\n\n const cardData = templateType.card_obb && Array.isArray(templateType.card_obb) && templateType.card_obb.length > 0\n ? templateType.card_obb[0]\n : null;\n\n if (!cardData) throw new Error('CARD_NOT_FULLY_IN_FRAME');\n\n let points: number[][] | null = null;\n let isCardInFrame = false;\n let hasCroppedSides = true;\n\n if (cardData.obb) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n } else if (Array.isArray(cardData) && Array.isArray(cardData[0])) {\n points = cardData[0];\n isCardInFrame = true;\n hasCroppedSides = false;\n if (points && points.length === 4) {\n const minX = Math.min(...points.map((p: number[]) => p[0]));\n const minY = Math.min(...points.map((p: number[]) => p[1]));\n if (minX <= 15 || minY <= 15) {\n isCardInFrame = false;\n hasCroppedSides = true;\n }\n }\n }\n\n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Template Framing failed.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n\n if (points && points.length >= 3) {\n assertCardNotTooFar(points);\n }\n\n const LPIPS_THRESHOLD = 0.75;\n if (templateType.lpips_score !== undefined && templateType.lpips_score > LPIPS_THRESHOLD) {\n logger.log(`🛑 Country Mismatch! LPIPS: ${templateType.lpips_score}`);\n throw new Error(`Le document présenté ne correspond pas au pays sélectionné (${result.docRegion}).`);\n }\n\n logger.log(\"templateType result\", JSON.stringify(truncateFields(templateType), null, 2));\n return templateType;\n } catch (e: any) {\n logger.error('Errorrr checking template type:', JSON.stringify(errorMessage(e), null, 2));\n if (e?.message === 'CARD_NOT_FULLY_IN_FRAME' || e?.message === 'TOO_FAR_AWAY' || e?.message?.includes('ne correspond pas')) throw e;\n throw new Error(e?.message || 'Erreur de vérification du template');\n }\n}"]}
@@ -113,8 +113,7 @@ export declare class KYCService {
113
113
  apiKey?: string;
114
114
  token?: string;
115
115
  }): Promise<unknown>;
116
- /** Verify WhatsApp code with OTP. POST /api/v1/accounts/verify-whatsapp-verification/ */
117
- verifyWhatsAppCode(sessionId: string, otp: string, auth?: {
116
+ verifyWhatsAppCode(sessionId: string, otp: string, phoneNumber: string, auth?: {
118
117
  apiKey?: string;
119
118
  token?: string;
120
119
  }): Promise<unknown>;
@@ -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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"}
@@ -20,11 +20,16 @@ export class KYCService {
20
20
  baseURL;
21
21
  apiKey;
22
22
  // Additional service base URLs (fixed as per current infra)
23
- faceServiceURL = 'https://kyc-engine.transfergratis.net:8000';
24
- textExtractionServiceURL = 'https://kyc-engine.transfergratis.net:8006';
25
- mrzServiceURL = 'https://kyc-engine.transfergratis.net:8002';
26
- barcodeServiceURL = 'https://kyc-engine.transfergratis.net:8000';
23
+ faceServiceURL = 'https://face-infera.sanctumkey.com';
24
+ textExtractionServiceURL = 'https://text-infera.sanctumkey.com';
25
+ mrzServiceURL = 'https://mrz-infera.sanctumkey.com';
26
+ barcodeServiceURL = 'https://kyc-engine.SanctumKey.net:8000';
27
27
  orientationServiceURL = 'http://18.188.180.154:8080';
28
+ // private faceServiceURL = 'https://kyc-engine.transfergratis.net:8000';
29
+ // private textExtractionServiceURL = 'https://kyc-engine.transfergratis.net:8006';
30
+ // private mrzServiceURL = 'https://kyc-engine.transfergratis.net:8002';
31
+ // private barcodeServiceURL = 'https://kyc-engine.transfergratis.net:8000';
32
+ // private orientationServiceURL = 'http://18.188.180.154:8080';
28
33
  constructor(baseURL, apiKey) {
29
34
  this.baseURL = baseURL;
30
35
  this.apiKey = apiKey;
@@ -157,7 +162,7 @@ export class KYCService {
157
162
  }
158
163
  const formData = new FormData();
159
164
  await appendFileToFormData(formData, 'file', idCardImageUri, 'id_card_photo.jpg', 'image/jpeg');
160
- const docTypeShorted = GovernmentDocumentTypeShorted[docType];
165
+ const docTypeShorted = GovernmentDocumentTypeShorted[docType] || docType;
161
166
  // Log metadata, NOT the FormData object
162
167
  logger.log('detectFaceOnId Request:', { docTypeShorted, imageUri: idCardImageUri });
163
168
  try {
@@ -210,7 +215,7 @@ export class KYCService {
210
215
  return res.data;
211
216
  }
212
217
  catch (e) {
213
- logger.error('Error checking template type:', JSON.stringify(e));
218
+ logger.error('Error checkingg template type:', JSON.stringify(e));
214
219
  throw e;
215
220
  }
216
221
  }
@@ -282,7 +287,6 @@ export class KYCService {
282
287
  // SANDBOX mode
283
288
  if (env === 'SANDBOX') {
284
289
  console.log("SANDBOX mode: Skipping AI MRZ extraction");
285
- logger.log("SANDBOX mode: Returning mock MRZ response");
286
290
  const { docType, docRegion, postfix = 'back', mrz_type } = params;
287
291
  return {
288
292
  success: true,
@@ -297,40 +301,61 @@ export class KYCService {
297
301
  };
298
302
  }
299
303
  const { fileUri, docType, docRegion, postfix = 'back', token, template_path, mrz_type } = params;
304
+ // 1. Build the FormData ONLY for the file
300
305
  const formData = new FormData();
301
- // Dynamic filename to prevent passports from crashing (since their MRZ is on the front)
302
- await appendFileToFormData(formData, 'file', fileUri, `id_card_${postfix}.jpg`, 'image/jpeg');
306
+ const filePayload = {
307
+ uri: fileUri,
308
+ type: 'image/jpeg',
309
+ name: `id_card_${postfix}.jpg`,
310
+ };
311
+ formData.append('file', filePayload);
303
312
  const docTypeShorted = GovernmentDocumentTypeShorted[docType] || docType;
313
+ const safeMrzType = mrz_type && mrz_type.trim() !== '' ? mrz_type : 'TD1';
304
314
  logger.log("docTypeShorted", docTypeShorted, docRegion, postfix);
305
- let url = `${this.mrzServiceURL}/extract_mrz_text/?doc_type=${encodeURIComponent(docTypeShorted)}&doc_region=${encodeURIComponent(docRegion)}&postfix=${encodeURIComponent(postfix)}&template_path=${encodeURIComponent(template_path)}`;
306
- if (mrz_type && mrz_type.trim() !== '') {
307
- url += `&mrz_type=${encodeURIComponent(mrz_type)}`;
308
- }
315
+ // 🚨 THE FIX: Pass all required text parameters in the URL query string for FastAPI
316
+ const queryParams = new URLSearchParams({
317
+ doc_type: docTypeShorted,
318
+ doc_region: docRegion,
319
+ postfix: postfix,
320
+ template_path: template_path,
321
+ mrz_type: safeMrzType,
322
+ reset_cache: 'true'
323
+ }).toString();
324
+ const url = `${this.mrzServiceURL}/extract_mrz_text/?${queryParams}`;
309
325
  logger.log("url", url);
310
- const attempt = async () => {
311
- try {
312
- const res = await axios.post(url, formData, {
313
- headers: { 'Content-Type': 'multipart/form-data', 'Authorization': `Bearer ${token}` },
314
- // Note: Reduced timeout to 10000ms (10s) based on our earlier network fix to prevent infinite hanging!
315
- timeout: 10000,
316
- });
317
- logger.log('extractMrzText res', JSON.stringify(res.data, null, 2));
318
- if (Object.keys(res.data).length === 0)
319
- throw new Error('No data found');
320
- if (res.data?.success === false)
321
- throw new Error(res.data.parsed_data?.status || 'Échec de l\'extraction MRZ');
322
- return res.data;
326
+ try {
327
+ const response = await fetch(url, {
328
+ method: 'POST',
329
+ headers: {
330
+ 'Authorization': `Bearer ${token}`,
331
+ 'Accept': 'application/json'
332
+ },
333
+ body: formData, // Only the file goes in the body
334
+ });
335
+ if (!response.ok) {
336
+ const errorText = await response.text();
337
+ logger.error('Backend MRZ Error Details:', errorText);
338
+ throw new Error(`Erreur serveur: ${response.status}`);
323
339
  }
324
- catch (e) {
325
- throw new Error(e?.message || 'Erreur de détection du MRZ');
340
+ // const data = await response.json();
341
+ // logger.log('extractMrzText res', JSON.stringify(data, null, 2));
342
+ // if (Object.keys(data).length === 0) throw new Error('No data found');
343
+ // if (data?.success === false) throw new Error(data.parsed_data?.status || 'Échec de l\'extraction MRZ');
344
+ // return data;
345
+ const data = await response.json();
346
+ logger.log('extractMrzText res', JSON.stringify(data, null, 2));
347
+ if (Object.keys(data).length === 0)
348
+ throw new Error('No data found');
349
+ // 🚨 UPDATE THIS LINE to grab the actual status_message:
350
+ if (data?.success === false) {
351
+ const serverMessage = data.parsed_data?.status_message || data.parsed_data?.status || 'Échec de l\'extraction MRZ';
352
+ throw new Error(`Lecture MRZ refusée: ${serverMessage}`);
326
353
  }
327
- };
328
- try {
329
- return await attempt();
354
+ return data;
330
355
  }
331
- catch (e) {
332
- logger.error('Error extracting MRZ text:', JSON.stringify(errorMessage(e), null, 2));
333
- throw e;
356
+ catch (error) {
357
+ logger.error("MRZ Fetch Error: ", error?.message || error);
358
+ throw new Error(error?.message || 'Erreur de connexion lors de l\'extraction MRZ');
334
359
  }
335
360
  }
336
361
  // STEP 2 - SELFIE VALIDATION
@@ -470,34 +495,61 @@ export class KYCService {
470
495
  /** Send WhatsApp verification code. POST /api/v1/accounts/send-whatsapp-verification/ */
471
496
  async sendWhatsAppVerificationCode(sessionId, phoneNumber, auth) {
472
497
  const url = `${KYCConfig.getBackendUrl()}/accounts/send-whatsapp-verification/`;
473
- const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());
474
- const res = await axios.post(url, {
498
+ // 1. Formatting (Ensure consistency with verification step)
499
+ const formattedPhoneNumber = phoneNumber.replace(/^\+/, '');
500
+ // 2. Prepare Payload
501
+ const payload = {
475
502
  session_id: sessionId,
476
- phone_number: phoneNumber
477
- }, {
478
- headers: {
479
- 'Content-Type': 'application/json',
480
- ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),
481
- },
482
- });
483
- return res.data;
484
- }
485
- /** Verify WhatsApp code with OTP. POST /api/v1/accounts/verify-whatsapp-verification/ */
486
- async verifyWhatsAppCode(sessionId, otp, auth) {
487
- // Note: Verify this endpoint matches your exact Django/backend route
488
- const url = `${KYCConfig.getBackendUrl()}/accounts/verify-whatsapp-verification/`;
503
+ phone_number: formattedPhoneNumber
504
+ };
489
505
  const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());
490
- const res = await axios.post(url, {
506
+ const headers = {
507
+ 'Content-Type': 'application/json',
508
+ ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),
509
+ };
510
+ try {
511
+ const res = await axios.post(url, payload, { headers });
512
+ logger.log("✅ WhatsApp Send Success:", res.data);
513
+ return res.data;
514
+ }
515
+ catch (error) {
516
+ if (error.response) {
517
+ logger.error("🛑 WhatsApp Send Failed (Server Response):", {
518
+ status: error.response.status,
519
+ data: error.response.data,
520
+ headers: error.response.headers
521
+ });
522
+ }
523
+ throw error;
524
+ }
525
+ }
526
+ async verifyWhatsAppCode(sessionId, otp, phoneNumber, auth) {
527
+ const url = `${KYCConfig.getBackendUrl()}/accounts/verify-whatsapp-code/`;
528
+ const formattedPhoneNumber = phoneNumber.replace(/^\+/, '');
529
+ const payload = {
491
530
  session_id: sessionId,
492
- otp: otp
493
- }, // Adjust this payload if your backend also expects 'phone_number' here
494
- {
495
- headers: {
496
- 'Content-Type': 'application/json',
497
- ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),
498
- },
499
- });
500
- return res.data;
531
+ verification_code: otp,
532
+ phone_number: formattedPhoneNumber
533
+ };
534
+ const token = auth?.apiKey ? undefined : (auth?.token ?? await authentification());
535
+ const headers = {
536
+ 'Content-Type': 'application/json',
537
+ ...(auth?.apiKey ? { 'Authorization': `ApiKey ${auth.apiKey}` } : { 'Authorization': `Bearer ${token}` }),
538
+ };
539
+ try {
540
+ const res = await axios.post(url, payload, { headers });
541
+ return res.data;
542
+ }
543
+ catch (error) {
544
+ if (error.response) {
545
+ logger.error("🛑 WhatsApp Verification Failed (Server Response):", {
546
+ status: error.response.status,
547
+ data: error.response.data,
548
+ headers: error.response.headers
549
+ });
550
+ }
551
+ throw error;
552
+ }
501
553
  }
502
554
  }
503
555
  const kycService = new KYCService("", "");
@@ -542,7 +594,7 @@ export const authentification = async () => {
542
594
  // 🚨 FIX: Do NOT use URLSearchParams in React Native with Axios.
543
595
  // Use a raw URL-encoded string to guarantee Keycloak understands the payload.
544
596
  const params = 'client_id=kyc_frontend&client_secret=QhgAmvKgmwODzsEp98dnA4PeUEMMaFHd&grant_type=client_credentials';
545
- const res = await axios.post(`https://keycloak.transfergratis.net/realms/kyc/protocol/openid-connect/token`, params, {
597
+ const res = await axios.post(`https://idms.sanctumkey.com/realms/kyc/protocol/openid-connect/token`, params, {
546
598
  headers: {
547
599
  'Content-Type': 'application/x-www-form-urlencoded',
548
600
  },