@sanctum-key/react-native-sdk 1.0.57 → 1.0.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/package.json +12 -2
- package/build/src/components/EnhancedCameraView.d.ts.map +1 -1
- package/build/src/components/EnhancedCameraView.js +5 -1
- package/build/src/components/EnhancedCameraView.js.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.d.ts.map +1 -1
- package/build/src/components/KYCElements/IDCardCapture.js +34 -13
- package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
- package/build/src/components/TemplateKYCExample.d.ts +2 -1
- package/build/src/components/TemplateKYCExample.d.ts.map +1 -1
- package/build/src/components/TemplateKYCExample.js +2 -2
- package/build/src/components/TemplateKYCExample.js.map +1 -1
- package/build/src/components/TemplateKYCFlowRefactored.d.ts +1 -0
- package/build/src/components/TemplateKYCFlowRefactored.d.ts.map +1 -1
- package/build/src/components/TemplateKYCFlowRefactored.js +56 -12
- package/build/src/components/TemplateKYCFlowRefactored.js.map +1 -1
- package/build/src/config/countriesData.d.ts.map +1 -1
- package/build/src/config/countriesData.js +249 -77
- package/build/src/config/countriesData.js.map +1 -1
- package/build/src/config/region_mapping.d.ts.map +1 -1
- package/build/src/config/region_mapping.js +45 -15
- package/build/src/config/region_mapping.js.map +1 -1
- package/build/src/modules/api/CardAuthentification.d.ts.map +1 -1
- package/build/src/modules/api/CardAuthentification.js +10 -2
- package/build/src/modules/api/CardAuthentification.js.map +1 -1
- package/build/src/utils/cropByObb.d.ts +1 -1
- package/build/src/utils/cropByObb.d.ts.map +1 -1
- package/build/src/utils/cropByObb.js +112 -5
- package/build/src/utils/cropByObb.js.map +1 -1
- package/build/src/utils/logger.d.ts +1 -0
- package/build/src/utils/logger.d.ts.map +1 -1
- package/build/src/utils/logger.js +37 -73
- package/build/src/utils/logger.js.map +1 -1
- package/build/src/web/WebKYCEntry.d.ts.map +1 -1
- package/build/src/web/WebKYCEntry.js +0 -2
- package/build/src/web/WebKYCEntry.js.map +1 -1
- package/package.json +12 -2
- package/src/components/EnhancedCameraView.tsx +4 -0
- package/src/components/KYCElements/IDCardCapture.tsx +49 -21
- package/src/components/TemplateKYCExample.tsx +4 -1
- package/src/components/TemplateKYCFlowRefactored.tsx +66 -11
- package/src/config/countriesData.ts +250 -78
- package/src/config/region_mapping.ts +700 -670
- package/src/modules/api/CardAuthentification.ts +11 -3
- package/src/utils/cropByObb.ts +160 -6
- package/src/utils/logger.ts +42 -93
- package/src/web/WebKYCEntry.tsx +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cropByObb.js","sourceRoot":"","sources":["../../../src/utils/cropByObb.ts"],"names":[],"mappings":"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","sourcesContent":["import { Platform } from 'react-native';\nimport * as ImageManipulator from \"expo-image-manipulator\";\n\n\ntype Point = [number, number];\n\nexport const OBB_CONFIDENCE_THRESHOLD = 0.85;\n\n\nexport function getObbConfidence(cardObb: any): number | null {\n if (!cardObb || !Array.isArray(cardObb) || cardObb.length === 0) return null;\n const first = cardObb[0];\n\n // New format: first is an object with a confidence field\n if (first && typeof first === 'object' && !Array.isArray(first) && 'confidence' in first) {\n const score = (first as any).confidence;\n return typeof score === 'number' ? score : null;\n }\n\n // Legacy format: [ [points], score ]\n if (!Array.isArray(first) || first.length < 2) return null;\n const score = first[1];\n return typeof score === 'number' ? score : null;\n}\n\n/**\n * Extracts the framing data from card_obb.\n * STRICT CHECK: Returns true ONLY if card_in_frame is true AND cropped_sides is empty.\n */\nexport function getCardInFrame(cardObb: any): boolean | null {\n if (!cardObb) return null;\n \n const first = Array.isArray(cardObb) ? cardObb[0] : cardObb;\n\n if (first && typeof first === 'object' && 'card_in_frame' in first) {\n const isCardInFrame = first.card_in_frame === true;\n const hasCroppedSides = Array.isArray(first.cropped_sides) && first.cropped_sides.length > 0;\n\n if (!isCardInFrame || hasCroppedSides) {\n if (hasCroppedSides) {\n console.warn(`Card is cropped on sides: ${first.cropped_sides.join(', ')}`);\n }\n return false;\n }\n\n return true;\n }\n\n if (cardObb && typeof cardObb === 'object' && 'card_in_frame' in cardObb) {\n const value = (cardObb as any).card_in_frame;\n return typeof value === 'boolean' ? value : null;\n }\n\n return null;\n}\n\n\nfunction extractObbPoints(cardObb: any): Point[] | null {\n if (!cardObb) return null;\n const first = Array.isArray(cardObb) ? cardObb[0] : cardObb;\n\n // New format: { obb: [...], confidence, ... }\n if (first && typeof first === 'object' && !Array.isArray(first) && 'obb' in first) {\n const pts = (first as any).obb;\n if (Array.isArray(pts) && pts.length === 4) return pts as Point[];\n }\n\n // Legacy format: [ [p1,p2,p3,p4], confidence ]\n if (Array.isArray(first) && Array.isArray(first[0]) && first[0].length === 4) {\n return first[0] as Point[];\n }\n\n return null;\n}\n\n// Compute axis-aligned bounding box from oriented quadrilateral\nfunction computeAabb(points: Point[]) {\n const xs = points.map(p => p[0]);\n const ys = points.map(p => p[1]);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n const maxX = Math.max(...xs);\n const maxY = Math.max(...ys);\n return { minX, minY, maxX, maxY, width: maxX - minX, height: maxY - minY };\n}\n\nasync function cropWeb(uri: string, points: Point[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n const { minX, minY, width, height } = computeAabb(points);\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, Math.round(width));\n canvas.height = Math.max(1, Math.round(height));\n const ctx = canvas.getContext('2d');\n if (!ctx) return reject(new Error('Canvas context not available'));\n ctx.drawImage(\n img,\n minX, minY, width, height, // Source\n 0, 0, canvas.width, canvas.height // Destination\n );\n resolve(canvas.toDataURL('image/jpeg', 0.92));\n };\n img.onerror = (e) => reject(e);\n img.src = uri;\n });\n}\n\nexport async function cropByObb(uri: string, cardObb: any): Promise<{ base64?: string; bbox?: { minX: number; minY: number; width: number; height: number } }> {\n try {\n const confidence = getObbConfidence(cardObb);\n if (confidence !== null && confidence < OBB_CONFIDENCE_THRESHOLD) {\n return {};\n }\n\n // FIX: Use extractObbPoints() which handles both legacy and new API formats.\n // The old code used `Array.isArray(first?.[0]) ? first[0] : null`, which\n // returned null for new-format responses like [{obb:[...], confidence}].\n const points = extractObbPoints(cardObb);\n if (!points || points.length !== 4) return {};\n\n const { minX, minY, width, height } = computeAabb(points);\n\n if (Platform.OS === 'web') {\n const base64 = await cropWeb(uri, points);\n return { base64, bbox: { minX, minY, width, height } };\n }\n \n return { bbox: { minX, minY, width, height } };\n } catch (e) {\n return {};\n }\n}\n\n\nasync function normalizeOrientationAndGetDimensions(\n uri: string\n): Promise<{ normalizedUri: string; width: number; height: number }> {\n // Web: canvas already handles EXIF; skip normalization\n if (Platform.OS === 'web') {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve({ normalizedUri: uri, width: img.naturalWidth, height: img.naturalHeight });\n img.onerror = reject;\n img.src = uri;\n });\n }\n\n const result = await ImageManipulator.manipulateAsync(\n uri,\n [], \n { \n compress: 1, \n format: ImageManipulator.SaveFormat.JPEG \n }\n );\n return { normalizedUri: result.uri, width: result.width, height: result.height };\n}\n\n\nexport async function cropImageWithBBoxWithTolerance(uri: string, bbox: any, tolerance: number = 0.02): Promise<string> {\n return new Promise<string>((resolve) => {\n let isResolved = false;\n\n // Safety Timeout (15 seconds — slightly longer to account for normalization step)\n const timeout = setTimeout(() => {\n if (!isResolved) {\n isResolved = true;\n console.warn(\"Crop timeout, returning original.\");\n resolve(uri);\n }\n }, 15000);\n\n (async () => {\n try {\n // STEP 1: Normalize EXIF orientation.\n // This is the core fix — on Android the raw photo pixels may be stored\n // rotated. After this call, normalizedUri has pixels matching the on-screen\n // orientation and actualWidth/actualHeight are the display-space dimensions.\n const { normalizedUri, width: actualWidth, height: actualHeight } =\n await normalizeOrientationAndGetDimensions(uri);\n\n if (isResolved) return;\n\n // STEP 2: Resolve bbox to pixel coordinates.\n // Detect if bbox is percentage (e.g., 0.90) or absolute pixels (e.g., 800).\n const isPercentageBased = bbox.width <= 1.5 && bbox.height <= 1.5;\n\n let pixelMinX: number, pixelMinY: number, pixelWidth: number, pixelHeight: number;\n\n if (isPercentageBased) {\n pixelMinX = bbox.minX * actualWidth;\n pixelMinY = bbox.minY * actualHeight;\n pixelWidth = bbox.width * actualWidth;\n pixelHeight = bbox.height * actualHeight;\n } else {\n pixelMinX = bbox.minX;\n pixelMinY = bbox.minY;\n pixelWidth = bbox.width;\n pixelHeight = bbox.height;\n }\n\n // STEP 3: Add tolerance and clamp to image bounds.\n const toleranceX = pixelWidth * tolerance;\n const toleranceY = pixelHeight * tolerance;\n\n const newMinX = Math.max(0, pixelMinX - toleranceX);\n const newMinY = Math.max(0, pixelMinY - toleranceY);\n const newMaxX = Math.min(actualWidth, pixelMinX + pixelWidth + toleranceX);\n const newMaxY = Math.min(actualHeight, pixelMinY + pixelHeight + toleranceY);\n\n const finalCrop = {\n originX: Math.floor(newMinX),\n originY: Math.floor(newMinY),\n width: Math.max(1, Math.floor(newMaxX - newMinX)),\n height: Math.max(1, Math.floor(newMaxY - newMinY)),\n };\n\n // STEP 4: Perform final crop on the already-normalized image.\n try {\n const result = await ImageManipulator.manipulateAsync(\n normalizedUri,\n [{ crop: finalCrop }],\n { compress: 0.95, format: ImageManipulator.SaveFormat.JPEG }\n );\n\n if (!isResolved) {\n isResolved = true;\n clearTimeout(timeout);\n resolve(result.uri);\n }\n } catch (err) {\n if (!isResolved) {\n isResolved = true;\n clearTimeout(timeout);\n console.error(\"ImageManipulator crop failed, returning normalized image\", err);\n\n resolve(normalizedUri);\n }\n }\n } catch (e) {\n if (!isResolved) {\n isResolved = true;\n clearTimeout(timeout);\n console.error(\"normalizeOrientationAndGetDimensions failed, returning original\", e);\n resolve(uri);\n }\n }\n })();\n });\n}\n\nexport async function cropToCenterScanArea(\n uri: string, \n scanWidthRatio: number = 0.91, // Match Kotlin's 0.91f\n scanAreaAspectRatio: number = 1.59 // Standard ID Card ratio\n): Promise<string> {\n return new Promise<string>((resolve) => {\n let isResolved = false;\n\n const timeout = setTimeout(() => {\n if (!isResolved) {\n isResolved = true;\n resolve(uri);\n }\n }, 10000);\n\n (async () => {\n try {\n // 1. Use Claude's brilliant EXIF normalization first!\n const { normalizedUri, width: actualWidth, height: actualHeight } = \n await normalizeOrientationAndGetDimensions(uri);\n\n if (isResolved) return;\n\n // 2. Apply the Kotlin mathematical centering\n const scanWidth = actualWidth * scanWidthRatio;\n const scanHeight = scanWidth / scanAreaAspectRatio;\n const left = (actualWidth - scanWidth) / 2;\n const top = (actualHeight - scanHeight) / 2;\n\n const finalCrop = {\n originX: Math.max(0, Math.floor(left)),\n originY: Math.max(0, Math.floor(top)),\n width: Math.max(1, Math.floor(scanWidth)),\n height: Math.max(1, Math.floor(scanHeight)),\n };\n\n // 3. Perform the final centered crop\n const result = await ImageManipulator.manipulateAsync(\n normalizedUri,\n [{ crop: finalCrop }],\n { compress: 0.95, format: ImageManipulator.SaveFormat.JPEG }\n );\n \n if (!isResolved) {\n isResolved = true;\n clearTimeout(timeout);\n resolve(result.uri);\n }\n } catch (err) {\n if (!isResolved) {\n isResolved = true;\n clearTimeout(timeout);\n console.error(\"Center crop failed, returning original\", err);\n resolve(uri); // Fallback to raw image\n }\n }\n })();\n });\n}"]}
|
|
1
|
+
{"version":3,"file":"cropByObb.js","sourceRoot":"","sources":["../../../src/utils/cropByObb.ts"],"names":[],"mappings":"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","sourcesContent":["import { Platform } from 'react-native';\nimport * as ImageManipulator from \"expo-image-manipulator\";\n\n\ntype Point = [number, number];\n\ntype PixelBbox = {\n minX: number;\n minY: number;\n width: number;\n height: number;\n};\n\ntype BboxOrientation = 'direct' | 'clockwise' | 'counter-clockwise' | 'upside-down';\n\ntype OrientedBboxCandidate = {\n bbox: PixelBbox;\n orientation: BboxOrientation;\n inFrameRatio: number;\n score: number;\n};\n\nexport const OBB_CONFIDENCE_THRESHOLD = 0.85;\n\n\nexport function getObbConfidence(cardObb: any): number | null {\n if (!cardObb || !Array.isArray(cardObb) || cardObb.length === 0) return null;\n const first = cardObb[0];\n\n // New format: first is an object with a confidence field\n if (first && typeof first === 'object' && !Array.isArray(first) && 'confidence' in first) {\n const score = (first as any).confidence;\n return typeof score === 'number' ? score : null;\n }\n\n // Legacy format: [ [points], score ]\n if (!Array.isArray(first) || first.length < 2) return null;\n const score = first[1];\n return typeof score === 'number' ? score : null;\n}\n\n/**\n * Extracts the framing data from card_obb.\n * STRICT CHECK: Returns true ONLY if card_in_frame is true AND cropped_sides is empty.\n */\nexport function getCardInFrame(cardObb: any): boolean | null {\n if (!cardObb) return null;\n \n const first = Array.isArray(cardObb) ? cardObb[0] : cardObb;\n\n if (first && typeof first === 'object' && 'card_in_frame' in first) {\n const isCardInFrame = first.card_in_frame === true;\n const hasCroppedSides = Array.isArray(first.cropped_sides) && first.cropped_sides.length > 0;\n\n if (!isCardInFrame || hasCroppedSides) {\n if (hasCroppedSides) {\n console.warn(`Card is cropped on sides: ${first.cropped_sides.join(', ')}`);\n }\n return false;\n }\n\n return true;\n }\n\n if (cardObb && typeof cardObb === 'object' && 'card_in_frame' in cardObb) {\n const value = (cardObb as any).card_in_frame;\n return typeof value === 'boolean' ? value : null;\n }\n\n return null;\n}\n\n\nfunction extractObbPoints(cardObb: any): Point[] | null {\n if (!cardObb) return null;\n const first = Array.isArray(cardObb) ? cardObb[0] : cardObb;\n\n // New format: { obb: [...], confidence, ... }\n if (first && typeof first === 'object' && !Array.isArray(first) && 'obb' in first) {\n const pts = (first as any).obb;\n if (Array.isArray(pts) && pts.length === 4) return pts as Point[];\n }\n\n // Legacy format: [ [p1,p2,p3,p4], confidence ]\n if (Array.isArray(first) && Array.isArray(first[0]) && first[0].length === 4) {\n return first[0] as Point[];\n }\n\n return null;\n}\n\n// Compute axis-aligned bounding box from oriented quadrilateral\nfunction computeAabb(points: Point[]) {\n const xs = points.map(p => p[0]);\n const ys = points.map(p => p[1]);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n const maxX = Math.max(...xs);\n const maxY = Math.max(...ys);\n return { minX, minY, maxX, maxY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction getInFrameRatio(bbox: PixelBbox, imageWidth: number, imageHeight: number): number {\n const left = Math.max(0, bbox.minX);\n const top = Math.max(0, bbox.minY);\n const right = Math.min(imageWidth, bbox.minX + bbox.width);\n const bottom = Math.min(imageHeight, bbox.minY + bbox.height);\n const intersectionArea = Math.max(0, right - left) * Math.max(0, bottom - top);\n const bboxArea = bbox.width * bbox.height;\n\n return bboxArea > 0 ? intersectionArea / bboxArea : 0;\n}\n\n/**\n * The API can return OBB coordinates in the camera sensor's pixel space while\n * ImageManipulator returns an EXIF-normalized image. On phones held sideways,\n * those spaces are 90 degrees apart. Select the representation which best fits\n * the normalized image instead of applying the server coordinates blindly.\n */\nfunction resolveBboxOrientation(\n bbox: PixelBbox,\n imageWidth: number,\n imageHeight: number,\n preferredCardOrientation: 'landscape' | 'portrait' | 'either' = 'landscape',\n): OrientedBboxCandidate {\n const candidates: Array<{ bbox: PixelBbox; orientation: BboxOrientation; priority: number }> = [\n {\n bbox,\n orientation: 'direct',\n priority: 0.75,\n },\n {\n // Source canvas is imageHeight x imageWidth and is rotated clockwise.\n bbox: {\n minX: imageWidth - bbox.minY - bbox.height,\n minY: bbox.minX,\n width: bbox.height,\n height: bbox.width,\n },\n orientation: 'clockwise',\n priority: 0,\n },\n {\n // Source canvas is imageHeight x imageWidth and is rotated counter-clockwise.\n bbox: {\n minX: bbox.minY,\n minY: imageHeight - bbox.minX - bbox.width,\n width: bbox.height,\n height: bbox.width,\n },\n orientation: 'counter-clockwise',\n priority: 0,\n },\n {\n bbox: {\n minX: imageWidth - bbox.minX - bbox.width,\n minY: imageHeight - bbox.minY - bbox.height,\n width: bbox.width,\n height: bbox.height,\n },\n orientation: 'upside-down',\n priority: -0.25,\n },\n ];\n\n const scoredCandidates = candidates.map((candidate) => {\n const candidateBbox = candidate.bbox;\n const inFrameRatio = getInFrameRatio(candidateBbox, imageWidth, imageHeight);\n const centerX = candidateBbox.minX + candidateBbox.width / 2;\n const centerY = candidateBbox.minY + candidateBbox.height / 2;\n const normalizedCenterDistance = Math.hypot(\n (centerX - imageWidth / 2) / Math.max(1, imageWidth / 2),\n (centerY - imageHeight / 2) / Math.max(1, imageHeight / 2),\n );\n const centerScore = 1 - Math.min(1, normalizedCenterDistance);\n\n const isLandscapeCard = candidateBbox.width >= candidateBbox.height;\n const preferredOrientationScore = preferredCardOrientation === 'either'\n ? 0\n : ((preferredCardOrientation === 'landscape') === isLandscapeCard ? 1 : 0);\n const areaRatio = (candidateBbox.width * candidateBbox.height) / Math.max(1, imageWidth * imageHeight);\n const plausibleAreaScore = Math.min(1, areaRatio / 0.08);\n\n return {\n bbox: candidateBbox,\n orientation: candidate.orientation,\n inFrameRatio,\n score:\n inFrameRatio * 100\n + centerScore * 3\n + preferredOrientationScore * 2\n + plausibleAreaScore\n + candidate.priority,\n };\n });\n\n return scoredCandidates.reduce((best, candidate) => (\n candidate.score > best.score ? candidate : best\n ));\n}\n\nasync function cropWeb(uri: string, points: Point[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n const { minX, minY, width, height } = computeAabb(points);\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, Math.round(width));\n canvas.height = Math.max(1, Math.round(height));\n const ctx = canvas.getContext('2d');\n if (!ctx) return reject(new Error('Canvas context not available'));\n ctx.drawImage(\n img,\n minX, minY, width, height, // Source\n 0, 0, canvas.width, canvas.height // Destination\n );\n resolve(canvas.toDataURL('image/jpeg', 0.92));\n };\n img.onerror = (e) => reject(e);\n img.src = uri;\n });\n}\n\nexport async function cropByObb(uri: string, cardObb: any): Promise<{ base64?: string; bbox?: { minX: number; minY: number; width: number; height: number } }> {\n try {\n const confidence = getObbConfidence(cardObb);\n if (confidence !== null && confidence < OBB_CONFIDENCE_THRESHOLD) {\n return {};\n }\n\n // FIX: Use extractObbPoints() which handles both legacy and new API formats.\n // The old code used `Array.isArray(first?.[0]) ? first[0] : null`, which\n // returned null for new-format responses like [{obb:[...], confidence}].\n const points = extractObbPoints(cardObb);\n if (!points || points.length !== 4) return {};\n\n const { minX, minY, width, height } = computeAabb(points);\n\n if (Platform.OS === 'web') {\n const base64 = await cropWeb(uri, points);\n return { base64, bbox: { minX, minY, width, height } };\n }\n \n return { bbox: { minX, minY, width, height } };\n } catch (e) {\n return {};\n }\n}\n\n\nasync function normalizeOrientationAndGetDimensions(\n uri: string\n): Promise<{ normalizedUri: string; width: number; height: number }> {\n // Web: canvas already handles EXIF; skip normalization\n if (Platform.OS === 'web') {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve({ normalizedUri: uri, width: img.naturalWidth, height: img.naturalHeight });\n img.onerror = reject;\n img.src = uri;\n });\n }\n\n const result = await ImageManipulator.manipulateAsync(\n uri,\n [], \n { \n compress: 1, \n format: ImageManipulator.SaveFormat.JPEG \n }\n );\n return { normalizedUri: result.uri, width: result.width, height: result.height };\n}\n\n\nexport async function cropImageWithBBoxWithTolerance(\n uri: string,\n bbox: any,\n tolerance: number = 0.02,\n preferredCardOrientation: 'landscape' | 'portrait' | 'either' = 'landscape',\n): Promise<string> {\n return new Promise<string>((resolve) => {\n let isResolved = false;\n\n // Safety Timeout (15 seconds — slightly longer to account for normalization step)\n const timeout = setTimeout(() => {\n if (!isResolved) {\n isResolved = true;\n console.warn(\"Crop timeout, returning original.\");\n resolve(uri);\n }\n }, 15000);\n\n (async () => {\n try {\n // STEP 1: Normalize EXIF orientation.\n // This is the core fix — on Android the raw photo pixels may be stored\n // rotated. After this call, normalizedUri has pixels matching the on-screen\n // orientation and actualWidth/actualHeight are the display-space dimensions.\n const { normalizedUri, width: actualWidth, height: actualHeight } =\n await normalizeOrientationAndGetDimensions(uri);\n\n if (isResolved) return;\n\n // STEP 2: Resolve bbox to pixel coordinates.\n // Detect if bbox is percentage (e.g., 0.90) or absolute pixels (e.g., 800).\n const isPercentageBased = bbox.width <= 1.5 && bbox.height <= 1.5;\n\n let pixelMinX: number, pixelMinY: number, pixelWidth: number, pixelHeight: number;\n\n if (isPercentageBased) {\n pixelMinX = bbox.minX * actualWidth;\n pixelMinY = bbox.minY * actualHeight;\n pixelWidth = bbox.width * actualWidth;\n pixelHeight = bbox.height * actualHeight;\n } else {\n const resolvedBbox = resolveBboxOrientation(\n {\n minX: bbox.minX,\n minY: bbox.minY,\n width: bbox.width,\n height: bbox.height,\n },\n actualWidth,\n actualHeight,\n preferredCardOrientation,\n );\n\n if (resolvedBbox.inFrameRatio < 0.6) {\n if (!isResolved) {\n isResolved = true;\n clearTimeout(timeout);\n console.warn('OBB does not match the normalized image bounds; returning the full image.', {\n bbox,\n imageSize: { width: actualWidth, height: actualHeight },\n bestOrientation: resolvedBbox.orientation,\n inFrameRatio: resolvedBbox.inFrameRatio,\n });\n resolve(normalizedUri);\n }\n return;\n }\n\n if (resolvedBbox.orientation !== 'direct') {\n console.info('Adjusted OBB coordinates for the normalized camera orientation.', {\n orientation: resolvedBbox.orientation,\n imageSize: { width: actualWidth, height: actualHeight },\n });\n }\n\n pixelMinX = resolvedBbox.bbox.minX;\n pixelMinY = resolvedBbox.bbox.minY;\n pixelWidth = resolvedBbox.bbox.width;\n pixelHeight = resolvedBbox.bbox.height;\n }\n\n // STEP 3: Add tolerance and clamp to image bounds.\n const toleranceX = pixelWidth * tolerance;\n const toleranceY = pixelHeight * tolerance;\n\n const newMinX = Math.max(0, pixelMinX - toleranceX);\n const newMinY = Math.max(0, pixelMinY - toleranceY);\n const newMaxX = Math.min(actualWidth, pixelMinX + pixelWidth + toleranceX);\n const newMaxY = Math.min(actualHeight, pixelMinY + pixelHeight + toleranceY);\n\n const finalCrop = {\n originX: Math.floor(newMinX),\n originY: Math.floor(newMinY),\n width: Math.max(1, Math.floor(newMaxX - newMinX)),\n height: Math.max(1, Math.floor(newMaxY - newMinY)),\n };\n\n // STEP 4: Perform final crop on the already-normalized image.\n try {\n const result = await ImageManipulator.manipulateAsync(\n normalizedUri,\n [{ crop: finalCrop }],\n { compress: 0.95, format: ImageManipulator.SaveFormat.JPEG }\n );\n\n if (!isResolved) {\n isResolved = true;\n clearTimeout(timeout);\n resolve(result.uri);\n }\n } catch (err) {\n if (!isResolved) {\n isResolved = true;\n clearTimeout(timeout);\n console.error(\"ImageManipulator crop failed, returning normalized image\", err);\n\n resolve(normalizedUri);\n }\n }\n } catch (e) {\n if (!isResolved) {\n isResolved = true;\n clearTimeout(timeout);\n console.error(\"normalizeOrientationAndGetDimensions failed, returning original\", e);\n resolve(uri);\n }\n }\n })();\n });\n}\n\nexport async function cropToCenterScanArea(\n uri: string, \n scanWidthRatio: number = 0.91, // Match Kotlin's 0.91f\n scanAreaAspectRatio: number = 1.59 // Standard ID Card ratio\n): Promise<string> {\n return new Promise<string>((resolve) => {\n let isResolved = false;\n\n const timeout = setTimeout(() => {\n if (!isResolved) {\n isResolved = true;\n resolve(uri);\n }\n }, 10000);\n\n (async () => {\n try {\n // 1. Use Claude's brilliant EXIF normalization first!\n const { normalizedUri, width: actualWidth, height: actualHeight } = \n await normalizeOrientationAndGetDimensions(uri);\n\n if (isResolved) return;\n\n // 2. Apply the Kotlin mathematical centering\n const scanWidth = actualWidth * scanWidthRatio;\n const scanHeight = scanWidth / scanAreaAspectRatio;\n const left = (actualWidth - scanWidth) / 2;\n const top = (actualHeight - scanHeight) / 2;\n\n const finalCrop = {\n originX: Math.max(0, Math.floor(left)),\n originY: Math.max(0, Math.floor(top)),\n width: Math.max(1, Math.floor(scanWidth)),\n height: Math.max(1, Math.floor(scanHeight)),\n };\n\n // 3. Perform the final centered crop\n const result = await ImageManipulator.manipulateAsync(\n normalizedUri,\n [{ crop: finalCrop }],\n { compress: 0.95, format: ImageManipulator.SaveFormat.JPEG }\n );\n \n if (!isResolved) {\n isResolved = true;\n clearTimeout(timeout);\n resolve(result.uri);\n }\n } catch (err) {\n if (!isResolved) {\n isResolved = true;\n clearTimeout(timeout);\n console.error(\"Center crop failed, returning original\", err);\n resolve(uri); // Fallback to raw image\n }\n }\n })();\n });\n}\n"]}
|
|
@@ -11,6 +11,7 @@ export declare const sdkLogger: {
|
|
|
11
11
|
flush: () => Promise<void>;
|
|
12
12
|
destroy: () => void;
|
|
13
13
|
setApiKey: (key: string) => void;
|
|
14
|
+
track: (eventName: string, properties?: Record<string, any>) => void;
|
|
14
15
|
log: (...args: any[]) => void;
|
|
15
16
|
info: (...args: any[]) => void;
|
|
16
17
|
warn: (...args: any[]) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,MAAM;mBACF,GAAG,EAAE;qBACH,GAAG,EAAE;oBACN,GAAG,EAAE;oBACL,GAAG,EAAE;qBACJ,GAAG,EAAE;CACvB,CAAC;AA4GF,eAAO,MAAM,SAAS;uBACD,MAAM;;;;qBAIR,MAAM;uBAEJ,MAAM,eAAe,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;mBAC5C,GAAG,EAAE;oBACJ,GAAG,EAAE;oBACL,GAAG,EAAE;qBACJ,GAAG,EAAE;qBACL,GAAG,EAAE;CACvB,CAAC"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { Platform, AppState } from 'react-native';
|
|
2
|
-
import
|
|
3
|
-
|
|
2
|
+
import PostHog from 'posthog-react-native';
|
|
3
|
+
const posthogClient = new PostHog('phc_qjCHjCgkdVniammXrrfLrmNPoPH5uAmkzoQMhrEhGaYR', {
|
|
4
|
+
host: 'https://eu.i.posthog.com',
|
|
5
|
+
disabled: false,
|
|
6
|
+
captureAppLifecycleEvents: false,
|
|
7
|
+
flushAt: 1,
|
|
8
|
+
flushInterval: 1000, // Backup: flush automatically every 1 second
|
|
9
|
+
});
|
|
4
10
|
const isProduction = () => {
|
|
5
11
|
if (typeof __DEV__ !== 'undefined') {
|
|
6
12
|
return !__DEV__;
|
|
@@ -24,16 +30,10 @@ export const logger = {
|
|
|
24
30
|
console.debug(...args); },
|
|
25
31
|
};
|
|
26
32
|
class SDKTelemetryLogger {
|
|
27
|
-
queue = [];
|
|
28
|
-
isFlushing = false;
|
|
29
|
-
maxQueueSize = 3;
|
|
30
|
-
flushIntervalMs = 3000;
|
|
31
33
|
sessionId;
|
|
32
|
-
apiKey;
|
|
33
|
-
timerId;
|
|
34
34
|
appStateSubscription;
|
|
35
35
|
constructor() {
|
|
36
|
-
|
|
36
|
+
// Flush PostHog when the app goes into the background
|
|
37
37
|
if (Platform.OS !== 'web') {
|
|
38
38
|
this.appStateSubscription = AppState.addEventListener('change', this.handleAppStateChange);
|
|
39
39
|
}
|
|
@@ -45,19 +45,25 @@ class SDKTelemetryLogger {
|
|
|
45
45
|
};
|
|
46
46
|
setSessionId(id) {
|
|
47
47
|
this.sessionId = id;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return { ...log, session_id: id };
|
|
51
|
-
}
|
|
52
|
-
return log;
|
|
48
|
+
posthogClient.identify(id, {
|
|
49
|
+
kyc_session_id: id,
|
|
53
50
|
});
|
|
54
|
-
this.flush();
|
|
55
51
|
}
|
|
56
52
|
clearSessionId() {
|
|
57
53
|
this.sessionId = undefined;
|
|
54
|
+
posthogClient.reset(); // Clears identity
|
|
58
55
|
}
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
// Kept as a no-op just in case your SDK still calls this somewhere
|
|
57
|
+
setApiKey(_key) {
|
|
58
|
+
// No longer needed for PostHog
|
|
59
|
+
}
|
|
60
|
+
track(eventName, properties) {
|
|
61
|
+
posthogClient.capture(`[SanctumKey] ${eventName}`, {
|
|
62
|
+
session_id: this.sessionId || null,
|
|
63
|
+
os: Platform.OS,
|
|
64
|
+
osVersion: Platform.Version,
|
|
65
|
+
...properties,
|
|
66
|
+
});
|
|
61
67
|
}
|
|
62
68
|
parseArgs(args) {
|
|
63
69
|
let message = '';
|
|
@@ -86,71 +92,29 @@ class SDKTelemetryLogger {
|
|
|
86
92
|
if (level === 'error')
|
|
87
93
|
console.error(devPrefix, message, metadata);
|
|
88
94
|
else if (level === 'warning')
|
|
89
|
-
console.warn(devPrefix, message, metadata);
|
|
95
|
+
console.warn(devPrefix, message, metadata);
|
|
90
96
|
else
|
|
91
97
|
console.log(devPrefix, message, metadata);
|
|
92
98
|
}
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
session_id: this.sessionId,
|
|
98
|
-
metadata: {
|
|
99
|
-
...metadata,
|
|
100
|
-
os: Platform.OS,
|
|
101
|
-
osVersion: Platform.Version,
|
|
102
|
-
}
|
|
99
|
+
const payloadMetadata = {
|
|
100
|
+
...metadata,
|
|
101
|
+
os: Platform.OS,
|
|
102
|
+
osVersion: Platform.Version,
|
|
103
103
|
};
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
104
|
+
const levelLabel = level.toUpperCase();
|
|
105
|
+
posthogClient.capture(`[SanctumKey] ${message}`, {
|
|
106
|
+
session_id: this.sessionId || null,
|
|
107
|
+
log_level: levelLabel,
|
|
108
|
+
...payloadMetadata,
|
|
109
|
+
});
|
|
110
|
+
if (level === 'error') {
|
|
108
111
|
this.flush();
|
|
109
112
|
}
|
|
110
113
|
}
|
|
111
114
|
async flush() {
|
|
112
|
-
|
|
113
|
-
return;
|
|
114
|
-
const batch = this.queue.map(log => ({
|
|
115
|
-
...log,
|
|
116
|
-
session_id: log.session_id || 'pre-session-startup'
|
|
117
|
-
}));
|
|
118
|
-
this.isFlushing = true;
|
|
119
|
-
this.queue = [];
|
|
120
|
-
try {
|
|
121
|
-
const url = `${KYCConfig.getBackendUrl()}/core/sdk/logs/`;
|
|
122
|
-
const headers = { 'Content-Type': 'application/json' };
|
|
123
|
-
if (this.apiKey) {
|
|
124
|
-
headers['Authorization'] = `ApiKey ${this.apiKey}`;
|
|
125
|
-
}
|
|
126
|
-
await axios.post(url, { logs: batch }, {
|
|
127
|
-
headers,
|
|
128
|
-
timeout: 5000
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
// 🚨 FIX 2: Stop Infinite Loops
|
|
133
|
-
// If the backend actively rejects our payload (400-499 error code), do NOT requeue it.
|
|
134
|
-
const isClientError = error.response && error.response.status >= 400 && error.response.status < 500;
|
|
135
|
-
if (!isClientError) {
|
|
136
|
-
// Only retry if it's a network failure or a 5xx Server Error
|
|
137
|
-
if (this.queue.length < 50) {
|
|
138
|
-
this.queue = [...batch, ...this.queue].slice(0, 50);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
if (!IS_PROD) {
|
|
143
|
-
console.error("[SDK_TELEMETRY] Backend rejected log payload. Dropping batch to prevent infinite loop.", error.response.data);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
finally {
|
|
148
|
-
this.isFlushing = false;
|
|
149
|
-
}
|
|
115
|
+
await posthogClient.flush();
|
|
150
116
|
}
|
|
151
117
|
destroy() {
|
|
152
|
-
if (this.timerId)
|
|
153
|
-
clearInterval(this.timerId);
|
|
154
118
|
if (this.appStateSubscription)
|
|
155
119
|
this.appStateSubscription.remove();
|
|
156
120
|
this.flush();
|
|
@@ -163,9 +127,9 @@ export const sdkLogger = {
|
|
|
163
127
|
flush: () => telemetryInstance.flush(),
|
|
164
128
|
destroy: () => telemetryInstance.destroy(),
|
|
165
129
|
setApiKey: (key) => telemetryInstance.setApiKey(key),
|
|
130
|
+
track: (eventName, properties) => telemetryInstance.track(eventName, properties),
|
|
166
131
|
log: (...args) => telemetryInstance.processLog('info', ...args),
|
|
167
132
|
info: (...args) => telemetryInstance.processLog('info', ...args),
|
|
168
|
-
// 🚨 FIX 1 (Continued): Map warn() function to send 'warning' to backend
|
|
169
133
|
warn: (...args) => telemetryInstance.processLog('warning', ...args),
|
|
170
134
|
error: (...args) => telemetryInstance.processLog('error', ...args),
|
|
171
135
|
debug: (...args) => telemetryInstance.processLog('debug', ...args),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"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","sourcesContent":["import { Platform, AppState, AppStateStatus } from 'react-native';\nimport axios from 'axios';\nimport KYCConfig from '../config/KYCConfig';\n\nconst isProduction = (): boolean => {\n if (typeof __DEV__ !== 'undefined') {\n return !__DEV__;\n }\n if (typeof process !== 'undefined' && process.env) {\n return process.env.NODE_ENV === 'production';\n }\n return false;\n};\n\nconst IS_PROD = isProduction();\n\nexport const logger = {\n log: (...args: any[]) => { if (!IS_PROD) console.log(...args); },\n error: (...args: any[]) => { if (!IS_PROD) console.error(...args); },\n warn: (...args: any[]) => { if (!IS_PROD) console.warn(...args); },\n info: (...args: any[]) => { if (!IS_PROD) console.info(...args); },\n debug: (...args: any[]) => { if (!IS_PROD) console.debug(...args); },\n};\n\n// ==========================================\n// 2. SDK TELEMETRY LOGGER (REMOTE)\n// ==========================================\n// 🚨 FIX 1: Changed 'warn' to 'warning' to match backend enums\ntype LogLevel = 'info' | 'warning' | 'error' | 'debug'; \n\ninterface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: string;\n session_id?: string;\n metadata?: any;\n}\n\nclass SDKTelemetryLogger {\n private queue: LogEntry[] = [];\n private isFlushing = false;\n private maxQueueSize = 3;\n private flushIntervalMs = 3000;\n private sessionId: string | undefined;\n private apiKey: string | undefined;\n private timerId?: ReturnType<typeof setInterval>;\n private appStateSubscription: any;\n\n constructor() {\n this.timerId = setInterval(() => this.flush(), this.flushIntervalMs);\n\n if (Platform.OS !== 'web') {\n this.appStateSubscription = AppState.addEventListener('change', this.handleAppStateChange);\n }\n }\n\n private handleAppStateChange = (nextAppState: AppStateStatus) => {\n if (nextAppState === 'background' || nextAppState === 'inactive') {\n this.flush();\n }\n };\n\n public setSessionId(id: string) {\n this.sessionId = id;\n \n this.queue = this.queue.map(log => {\n if (!log.session_id) {\n return { ...log, session_id: id };\n }\n return log;\n });\n\n this.flush();\n }\n\n public clearSessionId() {\n this.sessionId = undefined;\n }\n\n public setApiKey(key: string) {\n this.apiKey = key;\n }\n\n private parseArgs(args: any[]): { message: string, metadata: any } {\n let message = '';\n let metadata: any = {};\n\n args.forEach(arg => {\n if (typeof arg === 'string') {\n message += (message ? ' ' : '') + arg;\n } else if (arg instanceof Error) {\n message += (message ? ' ' : '') + arg.message;\n metadata.error_stack = arg.stack;\n } else if (typeof arg === 'object' && arg !== null) {\n Object.assign(metadata, arg);\n } else {\n message += (message ? ' ' : '') + String(arg);\n }\n });\n\n return { message: message || 'No message provided', metadata };\n }\n\n public processLog(level: LogLevel, ...args: any[]) {\n const { message, metadata } = this.parseArgs(args);\n\n if (!IS_PROD) {\n const devPrefix = `[SDK_TELEMETRY_${level.toUpperCase()}]`;\n if (level === 'error') console.error(devPrefix, message, metadata);\n else if (level === 'warning') console.warn(devPrefix, message, metadata); // Match updated level\n else console.log(devPrefix, message, metadata);\n }\n\n const entry: LogEntry = {\n level,\n message: message.substring(0, 500),\n timestamp: new Date().toISOString(),\n session_id: this.sessionId,\n metadata: {\n ...metadata,\n os: Platform.OS,\n osVersion: Platform.Version,\n }\n };\n\n this.queue.push(entry);\n\n const isError = level === 'error';\n const hitLimit = this.queue.length >= this.maxQueueSize;\n\n if (isError || (this.sessionId && hitLimit)) {\n this.flush();\n }\n }\n\n public async flush() {\n if (this.queue.length === 0 || this.isFlushing) return;\n\n const batch = this.queue.map(log => ({\n ...log,\n session_id: log.session_id || 'pre-session-startup' \n }));\n\n this.isFlushing = true;\n this.queue = [];\n\n try {\n const url = `${KYCConfig.getBackendUrl()}/core/sdk/logs/`; \n \n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (this.apiKey) {\n headers['Authorization'] = `ApiKey ${this.apiKey}`;\n }\n\n await axios.post(url, { logs: batch }, {\n headers,\n timeout: 5000 \n });\n } catch (error: any) {\n // 🚨 FIX 2: Stop Infinite Loops\n // If the backend actively rejects our payload (400-499 error code), do NOT requeue it.\n const isClientError = error.response && error.response.status >= 400 && error.response.status < 500;\n\n if (!isClientError) {\n // Only retry if it's a network failure or a 5xx Server Error\n if (this.queue.length < 50) {\n this.queue = [...batch, ...this.queue].slice(0, 50);\n }\n } else {\n if (!IS_PROD) {\n console.error(\"[SDK_TELEMETRY] Backend rejected log payload. Dropping batch to prevent infinite loop.\", error.response.data);\n }\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n public destroy() {\n if (this.timerId) clearInterval(this.timerId);\n if (this.appStateSubscription) this.appStateSubscription.remove();\n this.flush();\n }\n}\n\nconst telemetryInstance = new SDKTelemetryLogger();\n\nexport const sdkLogger = {\n setSessionId: (id: string) => telemetryInstance.setSessionId(id),\n clearSessionId: () => telemetryInstance.clearSessionId(),\n flush: () => telemetryInstance.flush(),\n destroy: () => telemetryInstance.destroy(),\n setApiKey: (key: string) => telemetryInstance.setApiKey(key),\n \n log: (...args: any[]) => telemetryInstance.processLog('info', ...args),\n info: (...args: any[]) => telemetryInstance.processLog('info', ...args),\n // 🚨 FIX 1 (Continued): Map warn() function to send 'warning' to backend\n warn: (...args: any[]) => telemetryInstance.processLog('warning', ...args), \n error: (...args: any[]) => telemetryInstance.processLog('error', ...args),\n debug: (...args: any[]) => telemetryInstance.processLog('debug', ...args),\n};"]}
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"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","sourcesContent":["import { Platform, AppState, AppStateStatus } from 'react-native';\nimport PostHog from 'posthog-react-native';\n\nconst posthogClient = new PostHog('phc_qjCHjCgkdVniammXrrfLrmNPoPH5uAmkzoQMhrEhGaYR', {\n host: 'https://eu.i.posthog.com',\n disabled: false,\n captureAppLifecycleEvents: false,\n flushAt: 1,\n flushInterval: 1000, // Backup: flush automatically every 1 second\n});\n\nconst isProduction = (): boolean => {\n if (typeof __DEV__ !== 'undefined') {\n return !__DEV__;\n }\n if (typeof process !== 'undefined' && process.env) {\n return process.env.NODE_ENV === 'production';\n }\n return false;\n};\nconst IS_PROD = isProduction();\n\nexport const logger = {\n log: (...args: any[]) => { if (!IS_PROD) console.log(...args); },\n error: (...args: any[]) => { if (!IS_PROD) console.error(...args); },\n warn: (...args: any[]) => { if (!IS_PROD) console.warn(...args); },\n info: (...args: any[]) => { if (!IS_PROD) console.info(...args); },\n debug: (...args: any[]) => { if (!IS_PROD) console.debug(...args); },\n};\n\n// ==========================================\n// 2. SDK TELEMETRY LOGGER (POSTHOG ONLY)\n// ==========================================\ntype LogLevel = 'info' | 'warning' | 'error' | 'debug';\n\nclass SDKTelemetryLogger {\n private sessionId: string | undefined;\n private appStateSubscription: any;\n\n constructor() {\n // Flush PostHog when the app goes into the background\n if (Platform.OS !== 'web') {\n this.appStateSubscription = AppState.addEventListener('change', this.handleAppStateChange);\n }\n }\n\n private handleAppStateChange = (nextAppState: AppStateStatus) => {\n if (nextAppState === 'background' || nextAppState === 'inactive') {\n this.flush();\n }\n };\n\n public setSessionId(id: string) {\n this.sessionId = id;\n posthogClient.identify(id, {\n kyc_session_id: id,\n });\n }\n\n public clearSessionId() {\n this.sessionId = undefined;\n posthogClient.reset(); // Clears identity\n }\n\n // Kept as a no-op just in case your SDK still calls this somewhere\n public setApiKey(_key: string) {\n // No longer needed for PostHog\n }\n\n public track(eventName: string, properties?: Record<string, any>) {\n posthogClient.capture(`[SanctumKey] ${eventName}`, {\n session_id: this.sessionId || null,\n os: Platform.OS,\n osVersion: Platform.Version,\n ...properties,\n });\n }\n\n private parseArgs(args: any[]): { message: string, metadata: any } {\n let message = '';\n let metadata: any = {};\n args.forEach(arg => {\n if (typeof arg === 'string') {\n message += (message ? ' ' : '') + arg;\n } else if (arg instanceof Error) {\n message += (message ? ' ' : '') + arg.message;\n metadata.error_stack = arg.stack;\n } else if (typeof arg === 'object' && arg !== null) {\n Object.assign(metadata, arg);\n } else {\n message += (message ? ' ' : '') + String(arg);\n }\n });\n return { message: message || 'No message provided', metadata };\n }\n\n public processLog(level: LogLevel, ...args: any[]) {\n const { message, metadata } = this.parseArgs(args);\n\n if (!IS_PROD) {\n const devPrefix = `[SDK_TELEMETRY_${level.toUpperCase()}]`;\n if (level === 'error') console.error(devPrefix, message, metadata);\n else if (level === 'warning') console.warn(devPrefix, message, metadata);\n else console.log(devPrefix, message, metadata);\n }\n\n const payloadMetadata = {\n ...metadata,\n os: Platform.OS,\n osVersion: Platform.Version,\n };\n\n const levelLabel = level.toUpperCase();\n posthogClient.capture(`[SanctumKey] ${message}`, {\n session_id: this.sessionId || null,\n log_level: levelLabel,\n ...payloadMetadata,\n });\n\n if (level === 'error') {\n this.flush();\n }\n }\n\n public async flush() {\n await posthogClient.flush();\n }\n\n public destroy() {\n if (this.appStateSubscription) this.appStateSubscription.remove();\n this.flush();\n }\n}\n\nconst telemetryInstance = new SDKTelemetryLogger();\n\nexport const sdkLogger = {\n setSessionId: (id: string) => telemetryInstance.setSessionId(id),\n clearSessionId: () => telemetryInstance.clearSessionId(),\n flush: () => telemetryInstance.flush(),\n destroy: () => telemetryInstance.destroy(),\n setApiKey: (key: string) => telemetryInstance.setApiKey(key),\n \n track: (eventName: string, properties?: Record<string, any>) => telemetryInstance.track(eventName, properties),\n log: (...args: any[]) => telemetryInstance.processLog('info', ...args),\n info: (...args: any[]) => telemetryInstance.processLog('info', ...args),\n warn: (...args: any[]) => telemetryInstance.processLog('warning', ...args),\n error: (...args: any[]) => telemetryInstance.processLog('error', ...args),\n debug: (...args: any[]) => telemetryInstance.processLog('debug', ...args),\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;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;
|
|
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;AA2ED,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAoP3G;AAYD,eAAe,WAAW,CAAC"}
|
|
@@ -5,13 +5,11 @@ 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
8
|
const postWebhook = async (url, payload, secret, timeoutMs = 5000) => {
|
|
10
9
|
const body = JSON.stringify(payload);
|
|
11
10
|
const headers = {
|
|
12
11
|
'Content-Type': 'application/json',
|
|
13
12
|
};
|
|
14
|
-
// 🚨 Generate HMAC SHA-256 Signature if secret is provided
|
|
15
13
|
if (secret) {
|
|
16
14
|
const signature = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);
|
|
17
15
|
headers['x-sanctumkey-signature'] = signature;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebKYCEntry.js","sourceRoot":"","sources":["../../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState, useCallback, JSX } from 'react';\nimport { View, Text, StyleSheet, SafeAreaView, ActivityIndicator } from 'react-native';\nimport { useI18n } from '../hooks/useI18n';\nimport { TemplateKYCExample } from '../components/TemplateKYCExample';\nimport { isCallbackUrlAllowed } from '../config/allowedDomains';\nimport KYCConfig from '../config/KYCConfig';\nimport { BackendEnvironment } from '../types/env.types';\nimport CryptoJS from 'crypto-js'; // 🚨 IMPORT ADDED\n\ninterface WebKYCEntryProps {\n onComplete?: (data: any) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n onSessionSave?: (sessionId: string) => void;\n}\n\ninterface URLParams {\n token?: string;\n return_url?: string;\n push_url?: string;\n save_session_url?: string;\n reference_id?: string;\n lang?: string;\n theme?: string;\n kyc_id?: string;\n secret?: string;\n env?: 'PRODUCTION' | 'SANDBOX';\n template_id?: string;\n server_env?: BackendEnvironment;\n step?: string;\n component_index?: string;\n country?: string;\n document_type?: string;\n region?: string;\n session_id?: string;\n resume?: boolean;\n}\n\ninterface VerificationSteps {\n document_analyzed?: boolean;\n selfie_analyzed?: boolean;\n liveness_checked?: boolean;\n}\n\n// 🚨 MODIFIED: Accepts the webhook secret to generate the signature\nconst postWebhook = async (url: string, payload: unknown, secret?: string, timeoutMs: number = 5000) => {\n const body = JSON.stringify(payload);\n \n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // 🚨 Generate HMAC SHA-256 Signature if secret is provided\n if (secret) {\n const signature = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);\n headers['x-sanctumkey-signature'] = signature;\n console.log(\"🔒 Generated Webhook Signature:\", signature);\n }\n\n const postWithTimeout = async (init: RequestInit) => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { method: 'POST', ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeoutId);\n }\n };\n\n if (typeof window !== 'undefined') {\n try {\n const response = await postWithTimeout({ headers, body, keepalive: true });\n if (!response.ok) throw new Error(`Webhook failed with status ${response.status}`);\n return;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') throw error;\n // Fallback for CORS issues, though signature headers might be stripped in 'no-cors' mode\n await postWithTimeout({ \n mode: 'no-cors', \n headers: { 'Content-Type': 'text/plain;charset=UTF-8' }, \n body, \n keepalive: true \n });\n return;\n }\n }\n\n const response = await postWithTimeout({ headers, body });\n if (!response.ok) throw new Error(`Webhook failed with status ${response.status}`);\n};\n\nexport function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave }: WebKYCEntryProps): JSX.Element {\n const { setLocale } = useI18n();\n const [urlParams, setUrlParams] = useState<URLParams>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isAnalyzing, setIsAnalyzing] = useState(false);\n\n const parseUrlParams = useCallback((): URLParams => {\n if (typeof window === 'undefined') return {};\n const rawUrl = window.location.href;\n console.log(\"Raw URL intercepted:\", rawUrl);\n \n const paramsString = rawUrl.replace(/^[^?#]*[?#]/, '').replace(/[?#]/g, '&');\n const urlParams = new URLSearchParams(paramsString);\n const getParam = (key: string) => urlParams.get(key) || undefined;\n \n const envParam = getParam('env');\n const validEnv = envParam === 'SANDBOX' || envParam === 'PRODUCTION' ? envParam : 'PRODUCTION';\n \n const serverEnvParam = getParam('server_env');\n const validServerEnv: BackendEnvironment = serverEnvParam === 'TEST' || serverEnvParam === 'PRODUCTION' ? (serverEnvParam as BackendEnvironment) : 'PRODUCTION';\n \n return {\n token: getParam('token'),\n return_url: getParam('return_url'),\n push_url: getParam('push_url'),\n save_session_url: getParam('save_session_url') || getParam('saveSessionUrl'),\n reference_id: getParam('reference_id'),\n lang: getParam('lang') || 'en',\n theme: getParam('theme') || 'light',\n kyc_id: getParam('kyc_id') || getParam('session_id'),\n secret: getParam('secret'),\n env: validEnv,\n template_id: getParam('template_id'),\n server_env: validServerEnv,\n step: getParam('step'),\n component_index: getParam('component_index'),\n country: getParam('country'),\n document_type: getParam('document_type'),\n region: getParam('region'),\n resume: getParam('resume') === 'true',\n };\n }, []);\n\n const redirectToReturnUrl = useCallback(async (params: {\n status: 'completed' | 'cancelled' | 'error';\n kyc_id?: string;\n message?: string;\n processing_state?: 'analyzing' | 'completed' | 'pending';\n verification_steps?: VerificationSteps;\n }) => {\n const { return_url } = urlParams;\n if (!return_url) {\n console.warn('No return_url provided');\n return;\n }\n\n try {\n const validation = isCallbackUrlAllowed(return_url);\n if (!validation.allowed) {\n console.error('Callback URL validation failed:', validation.reason);\n setError(`Security Error: ${validation.reason}`);\n return;\n }\n\n if (window.parent !== window) {\n const targetOrigin = new URL(return_url).origin;\n window.parent.postMessage({\n type: 'kyc_result',\n status: params.status,\n kyc_id: params.kyc_id,\n message: params.message,\n processing_state: params.processing_state,\n verification_steps: params.verification_steps\n }, targetOrigin);\n } else {\n window.location.href = return_url;\n }\n } catch (error) {\n console.error('Error during redirect:', error);\n setError('Failed to redirect to callback URL');\n }\n }, [urlParams]);\n\n const handleComplete = useCallback(async (data: any) => {\n console.log('KYC completed, raw state:', data);\n const isStillProcessing = data?.isProcessing || data?.session?.isProcessing;\n\n if (urlParams.push_url) {\n try {\n const backendResult = data?.verification?.result || data?.result?.result || data?.result || data;\n const finalSessionId = data?.session?.session_id || backendResult?.session_id || backendResult?.data?.session_id || urlParams.kyc_id || 'unknown';\n \n let parsedKycData: any = {};\n if (backendResult?.data) {\n try {\n parsedKycData = typeof backendResult.data === 'string' ? JSON.parse(backendResult.data) : backendResult.data;\n } catch (e) {\n console.warn(\"Could not parse backendResult.data JSON\");\n }\n }\n \n if (parsedKycData && typeof parsedKycData === 'object' && parsedKycData[finalSessionId]) {\n const nested = parsedKycData[finalSessionId];\n if (nested?.data) {\n parsedKycData = typeof nested.data === 'string' ? JSON.parse(nested.data) : nested.data;\n } else {\n parsedKycData = nested;\n }\n }\n\n const verificationState = {\n session_id: finalSessionId,\n reference_id: urlParams.reference_id || backendResult?.referenceId || null,\n status: backendResult?.status || data?.verification?.status || 'completed',\n message: backendResult?.message || backendResult?.reason || backendResult?.issues?.[0] || 'Verification finished.',\n data: parsedKycData || {}\n };\n\n const hasValidSessionId = finalSessionId && finalSessionId !== 'unknown';\n const hasValidData = parsedKycData && Object.keys(parsedKycData).length > 0;\n\n if (!hasValidSessionId || !hasValidData) {\n console.log(\"Webhook Blocked: Payload contains no data or session_id is unknown.\");\n } else {\n // 🚨 MODIFIED: Passing urlParams.secret\n await postWebhook(urlParams.push_url, verificationState, urlParams.secret, 5000);\n }\n } catch (err) {\n console.warn('Failed to construct or push data to webhook URL:', err);\n }\n }\n\n setIsAnalyzing(false);\n redirectToReturnUrl({\n status: data?.verification?.status === 'failed' ? 'error' : 'completed',\n kyc_id: data?.session?.session_id || urlParams.kyc_id,\n message: 'KYC process concluded',\n processing_state: isStillProcessing ? 'analyzing' : 'completed',\n verification_steps: { document_analyzed: true, selfie_analyzed: true, liveness_checked: true },\n });\n onComplete?.(data);\n }, [redirectToReturnUrl, urlParams, onComplete]);\n\n const handleError = useCallback((error: string) => {\n console.error('KYC error:', error);\n setIsAnalyzing(false);\n redirectToReturnUrl({ status: 'error', kyc_id: urlParams.kyc_id, message: error, processing_state: 'pending' });\n onError?.(error);\n }, [redirectToReturnUrl, urlParams.kyc_id, onError]);\n\n const handleCancel = useCallback(async () => {\n setIsAnalyzing(false);\n if (urlParams.push_url) {\n try {\n // 🚨 MODIFIED: Passing urlParams.secret\n await postWebhook(\n urlParams.push_url, \n { status: 'cancelled', result: null, reference_id: urlParams.reference_id }, \n urlParams.secret, \n 5000\n );\n } catch (err) {\n console.warn('Failed to push data to webhook URL:', err);\n }\n }\n \n redirectToReturnUrl({ status: 'cancelled', kyc_id: urlParams.kyc_id, message: 'KYC process was cancelled', processing_state: 'pending' });\n onCancel?.();\n }, [redirectToReturnUrl, urlParams.kyc_id, urlParams.push_url, urlParams.reference_id, urlParams.secret, onCancel]);\n\n const handleSessionSave = useCallback(async (sessionId: string) => {\n if (urlParams.save_session_url) {\n try {\n // 🚨 MODIFIED: Passing urlParams.secret\n await postWebhook(\n urlParams.save_session_url, \n { status: 'session_created', reference_id: urlParams.reference_id, result: { session_id: sessionId, kyc_id: sessionId } }, \n urlParams.secret, \n 5000\n );\n } catch (err) {\n console.warn('Failed to push session data:', err);\n }\n }\n onSessionSave?.(sessionId);\n }, [urlParams.save_session_url, urlParams.reference_id, urlParams.secret, onSessionSave]);\n\n useEffect(() => {\n try {\n const params = parseUrlParams();\n setUrlParams(params);\n if (params.lang) setLocale(params.lang);\n if (params.server_env) KYCConfig.setBackendEnvironment(params.server_env);\n setIsLoading(false);\n } catch (error) {\n setError('Error parsing URL parameters');\n setIsLoading(false);\n }\n }, [parseUrlParams, setLocale]);\n\n if (isLoading) return <View style={styles.container}><Text style={styles.loadingText}>Loading KYC process...</Text></View>;\n if (error) return <View style={styles.container}><Text style={styles.errorText}>Error: {error}</Text></View>;\n if (!urlParams.token) return <View style={styles.container}><Text style={styles.errorText}>No token provided in URL parameters</Text></View>;\n\n return (\n <SafeAreaView style={styles.container}>\n {isAnalyzing && (\n <View style={styles.analyzingOverlay}>\n <View style={styles.analyzingContainer}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={styles.analyzingText}>Analyzing verification data...</Text>\n <Text style={styles.analyzingSubtext}>This may take a few moments</Text>\n </View>\n </View>\n )}\n {/* Overlay UI unchanged */}\n <TemplateKYCExample\n // ...Props unchanged...\n onComplete={handleComplete}\n onCancel={handleCancel}\n onError={handleError}\n language={urlParams.lang || 'en'}\n API_KEY={urlParams.token}\n templateId={urlParams.template_id}\n env={urlParams.env || 'PRODUCTION'}\n serverEnv={urlParams.server_env}\n existingSessionId={urlParams.kyc_id}\n initialComponentIndex={(() => {\n const raw = urlParams.component_index ?? urlParams.step;\n if (raw == null || raw === '') return undefined;\n const index = parseInt(raw, 10);\n return Number.isNaN(index) ? undefined : index;\n })()}\n initialCountryResume={urlParams.country && urlParams.document_type ? { \n code: urlParams.country, \n documentType: urlParams.document_type, \n region: urlParams.region || undefined \n } : undefined}\n referenceId={urlParams.reference_id}\n onSessionSave={handleSessionSave}\n />\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1, backgroundColor: '#f5f5f5', overflow: 'visible' as any },\n loadingText: { fontSize: 18, textAlign: 'center', marginTop: 50, color: '#666' },\n errorText: { fontSize: 16, textAlign: 'center', marginTop: 50, color: '#dc2626', paddingHorizontal: 20 },\n analyzingOverlay: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, backgroundColor: 'rgba(0, 0, 0, 0.7)', justifyContent: 'center', alignItems: 'center', zIndex: 9999 },\n analyzingContainer: { backgroundColor: 'white', borderRadius: 12, padding: 32, alignItems: 'center', shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.3, shadowRadius: 8, elevation: 8 },\n analyzingText: { fontSize: 18, fontWeight: '600', color: '#333', marginTop: 16, textAlign: 'center' },\n analyzingSubtext: { fontSize: 14, color: '#666', marginTop: 8, textAlign: 'center' },\n});\n\nexport default WebKYCEntry;"]}
|
|
1
|
+
{"version":3,"file":"WebKYCEntry.js","sourceRoot":"","sources":["../../../src/web/WebKYCEntry.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useState, useCallback, JSX } from 'react';\nimport { View, Text, StyleSheet, SafeAreaView, ActivityIndicator } from 'react-native';\nimport { useI18n } from '../hooks/useI18n';\nimport { TemplateKYCExample } from '../components/TemplateKYCExample';\nimport { isCallbackUrlAllowed } from '../config/allowedDomains';\nimport KYCConfig from '../config/KYCConfig';\nimport { BackendEnvironment } from '../types/env.types';\nimport CryptoJS from 'crypto-js'; // 🚨 IMPORT ADDED\n\ninterface WebKYCEntryProps {\n onComplete?: (data: any) => void;\n onError?: (error: string) => void;\n onCancel?: () => void;\n onSessionSave?: (sessionId: string) => void;\n}\n\ninterface URLParams {\n token?: string;\n return_url?: string;\n push_url?: string;\n save_session_url?: string;\n reference_id?: string;\n lang?: string;\n theme?: string;\n kyc_id?: string;\n secret?: string;\n env?: 'PRODUCTION' | 'SANDBOX';\n template_id?: string;\n server_env?: BackendEnvironment;\n step?: string;\n component_index?: string;\n country?: string;\n document_type?: string;\n region?: string;\n session_id?: string;\n resume?: boolean;\n}\n\ninterface VerificationSteps {\n document_analyzed?: boolean;\n selfie_analyzed?: boolean;\n liveness_checked?: boolean;\n}\n\nconst postWebhook = async (url: string, payload: unknown, secret?: string, timeoutMs: number = 5000) => {\n const body = JSON.stringify(payload);\n \n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (secret) {\n const signature = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);\n headers['x-sanctumkey-signature'] = signature;\n console.log(\"🔒 Generated Webhook Signature:\", signature);\n }\n\n const postWithTimeout = async (init: RequestInit) => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { method: 'POST', ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeoutId);\n }\n };\n\n if (typeof window !== 'undefined') {\n try {\n const response = await postWithTimeout({ headers, body, keepalive: true });\n if (!response.ok) throw new Error(`Webhook failed with status ${response.status}`);\n return;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') throw error;\n // Fallback for CORS issues, though signature headers might be stripped in 'no-cors' mode\n await postWithTimeout({ \n mode: 'no-cors', \n headers: { 'Content-Type': 'text/plain;charset=UTF-8' }, \n body, \n keepalive: true \n });\n return;\n }\n }\n\n const response = await postWithTimeout({ headers, body });\n if (!response.ok) throw new Error(`Webhook failed with status ${response.status}`);\n};\n\nexport function WebKYCEntry({ onComplete, onError, onCancel, onSessionSave }: WebKYCEntryProps): JSX.Element {\n const { setLocale } = useI18n();\n const [urlParams, setUrlParams] = useState<URLParams>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isAnalyzing, setIsAnalyzing] = useState(false);\n\n const parseUrlParams = useCallback((): URLParams => {\n if (typeof window === 'undefined') return {};\n const rawUrl = window.location.href;\n console.log(\"Raw URL intercepted:\", rawUrl);\n \n const paramsString = rawUrl.replace(/^[^?#]*[?#]/, '').replace(/[?#]/g, '&');\n const urlParams = new URLSearchParams(paramsString);\n const getParam = (key: string) => urlParams.get(key) || undefined;\n \n const envParam = getParam('env');\n const validEnv = envParam === 'SANDBOX' || envParam === 'PRODUCTION' ? envParam : 'PRODUCTION';\n \n const serverEnvParam = getParam('server_env');\n const validServerEnv: BackendEnvironment = serverEnvParam === 'TEST' || serverEnvParam === 'PRODUCTION' ? (serverEnvParam as BackendEnvironment) : 'PRODUCTION';\n \n return {\n token: getParam('token'),\n return_url: getParam('return_url'),\n push_url: getParam('push_url'),\n save_session_url: getParam('save_session_url') || getParam('saveSessionUrl'),\n reference_id: getParam('reference_id'),\n lang: getParam('lang') || 'en',\n theme: getParam('theme') || 'light',\n kyc_id: getParam('kyc_id') || getParam('session_id'),\n secret: getParam('secret'),\n env: validEnv,\n template_id: getParam('template_id'),\n server_env: validServerEnv,\n step: getParam('step'),\n component_index: getParam('component_index'),\n country: getParam('country'),\n document_type: getParam('document_type'),\n region: getParam('region'),\n resume: getParam('resume') === 'true',\n };\n }, []);\n\n const redirectToReturnUrl = useCallback(async (params: {\n status: 'completed' | 'cancelled' | 'error';\n kyc_id?: string;\n message?: string;\n processing_state?: 'analyzing' | 'completed' | 'pending';\n verification_steps?: VerificationSteps;\n }) => {\n const { return_url } = urlParams;\n if (!return_url) {\n console.warn('No return_url provided');\n return;\n }\n\n try {\n const validation = isCallbackUrlAllowed(return_url);\n if (!validation.allowed) {\n console.error('Callback URL validation failed:', validation.reason);\n setError(`Security Error: ${validation.reason}`);\n return;\n }\n\n if (window.parent !== window) {\n const targetOrigin = new URL(return_url).origin;\n window.parent.postMessage({\n type: 'kyc_result',\n status: params.status,\n kyc_id: params.kyc_id,\n message: params.message,\n processing_state: params.processing_state,\n verification_steps: params.verification_steps\n }, targetOrigin);\n } else {\n window.location.href = return_url;\n }\n } catch (error) {\n console.error('Error during redirect:', error);\n setError('Failed to redirect to callback URL');\n }\n }, [urlParams]);\n\n const handleComplete = useCallback(async (data: any) => {\n console.log('KYC completed, raw state:', data);\n const isStillProcessing = data?.isProcessing || data?.session?.isProcessing;\n\n if (urlParams.push_url) {\n try {\n const backendResult = data?.verification?.result || data?.result?.result || data?.result || data;\n const finalSessionId = data?.session?.session_id || backendResult?.session_id || backendResult?.data?.session_id || urlParams.kyc_id || 'unknown';\n \n let parsedKycData: any = {};\n if (backendResult?.data) {\n try {\n parsedKycData = typeof backendResult.data === 'string' ? JSON.parse(backendResult.data) : backendResult.data;\n } catch (e) {\n console.warn(\"Could not parse backendResult.data JSON\");\n }\n }\n \n if (parsedKycData && typeof parsedKycData === 'object' && parsedKycData[finalSessionId]) {\n const nested = parsedKycData[finalSessionId];\n if (nested?.data) {\n parsedKycData = typeof nested.data === 'string' ? JSON.parse(nested.data) : nested.data;\n } else {\n parsedKycData = nested;\n }\n }\n\n const verificationState = {\n session_id: finalSessionId,\n reference_id: urlParams.reference_id || backendResult?.referenceId || null,\n status: backendResult?.status || data?.verification?.status || 'completed',\n message: backendResult?.message || backendResult?.reason || backendResult?.issues?.[0] || 'Verification finished.',\n data: parsedKycData || {}\n };\n\n const hasValidSessionId = finalSessionId && finalSessionId !== 'unknown';\n const hasValidData = parsedKycData && Object.keys(parsedKycData).length > 0;\n\n if (!hasValidSessionId || !hasValidData) {\n console.log(\"Webhook Blocked: Payload contains no data or session_id is unknown.\");\n } else {\n // 🚨 MODIFIED: Passing urlParams.secret\n await postWebhook(urlParams.push_url, verificationState, urlParams.secret, 5000);\n }\n } catch (err) {\n console.warn('Failed to construct or push data to webhook URL:', err);\n }\n }\n\n setIsAnalyzing(false);\n redirectToReturnUrl({\n status: data?.verification?.status === 'failed' ? 'error' : 'completed',\n kyc_id: data?.session?.session_id || urlParams.kyc_id,\n message: 'KYC process concluded',\n processing_state: isStillProcessing ? 'analyzing' : 'completed',\n verification_steps: { document_analyzed: true, selfie_analyzed: true, liveness_checked: true },\n });\n onComplete?.(data);\n }, [redirectToReturnUrl, urlParams, onComplete]);\n\n const handleError = useCallback((error: string) => {\n console.error('KYC error:', error);\n setIsAnalyzing(false);\n redirectToReturnUrl({ status: 'error', kyc_id: urlParams.kyc_id, message: error, processing_state: 'pending' });\n onError?.(error);\n }, [redirectToReturnUrl, urlParams.kyc_id, onError]);\n\n const handleCancel = useCallback(async () => {\n setIsAnalyzing(false);\n if (urlParams.push_url) {\n try {\n // 🚨 MODIFIED: Passing urlParams.secret\n await postWebhook(\n urlParams.push_url, \n { status: 'cancelled', result: null, reference_id: urlParams.reference_id }, \n urlParams.secret, \n 5000\n );\n } catch (err) {\n console.warn('Failed to push data to webhook URL:', err);\n }\n }\n \n redirectToReturnUrl({ status: 'cancelled', kyc_id: urlParams.kyc_id, message: 'KYC process was cancelled', processing_state: 'pending' });\n onCancel?.();\n }, [redirectToReturnUrl, urlParams.kyc_id, urlParams.push_url, urlParams.reference_id, urlParams.secret, onCancel]);\n\n const handleSessionSave = useCallback(async (sessionId: string) => {\n if (urlParams.save_session_url) {\n try {\n // 🚨 MODIFIED: Passing urlParams.secret\n await postWebhook(\n urlParams.save_session_url, \n { status: 'session_created', reference_id: urlParams.reference_id, result: { session_id: sessionId, kyc_id: sessionId } }, \n urlParams.secret, \n 5000\n );\n } catch (err) {\n console.warn('Failed to push session data:', err);\n }\n }\n onSessionSave?.(sessionId);\n }, [urlParams.save_session_url, urlParams.reference_id, urlParams.secret, onSessionSave]);\n\n useEffect(() => {\n try {\n const params = parseUrlParams();\n setUrlParams(params);\n if (params.lang) setLocale(params.lang);\n if (params.server_env) KYCConfig.setBackendEnvironment(params.server_env);\n setIsLoading(false);\n } catch (error) {\n setError('Error parsing URL parameters');\n setIsLoading(false);\n }\n }, [parseUrlParams, setLocale]);\n\n if (isLoading) return <View style={styles.container}><Text style={styles.loadingText}>Loading KYC process...</Text></View>;\n if (error) return <View style={styles.container}><Text style={styles.errorText}>Error: {error}</Text></View>;\n if (!urlParams.token) return <View style={styles.container}><Text style={styles.errorText}>No token provided in URL parameters</Text></View>;\n\n return (\n <SafeAreaView style={styles.container}>\n {isAnalyzing && (\n <View style={styles.analyzingOverlay}>\n <View style={styles.analyzingContainer}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={styles.analyzingText}>Analyzing verification data...</Text>\n <Text style={styles.analyzingSubtext}>This may take a few moments</Text>\n </View>\n </View>\n )}\n {/* Overlay UI unchanged */}\n <TemplateKYCExample\n // ...Props unchanged...\n onComplete={handleComplete}\n onCancel={handleCancel}\n onError={handleError}\n language={urlParams.lang || 'en'}\n API_KEY={urlParams.token}\n templateId={urlParams.template_id}\n env={urlParams.env || 'PRODUCTION'}\n serverEnv={urlParams.server_env}\n existingSessionId={urlParams.kyc_id}\n initialComponentIndex={(() => {\n const raw = urlParams.component_index ?? urlParams.step;\n if (raw == null || raw === '') return undefined;\n const index = parseInt(raw, 10);\n return Number.isNaN(index) ? undefined : index;\n })()}\n initialCountryResume={urlParams.country && urlParams.document_type ? { \n code: urlParams.country, \n documentType: urlParams.document_type, \n region: urlParams.region || undefined \n } : undefined}\n referenceId={urlParams.reference_id}\n onSessionSave={handleSessionSave}\n />\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1, backgroundColor: '#f5f5f5', overflow: 'visible' as any },\n loadingText: { fontSize: 18, textAlign: 'center', marginTop: 50, color: '#666' },\n errorText: { fontSize: 16, textAlign: 'center', marginTop: 50, color: '#dc2626', paddingHorizontal: 20 },\n analyzingOverlay: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, backgroundColor: 'rgba(0, 0, 0, 0.7)', justifyContent: 'center', alignItems: 'center', zIndex: 9999 },\n analyzingContainer: { backgroundColor: 'white', borderRadius: 12, padding: 32, alignItems: 'center', shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.3, shadowRadius: 8, elevation: 8 },\n analyzingText: { fontSize: 18, fontWeight: '600', color: '#333', marginTop: 16, textAlign: 'center' },\n analyzingSubtext: { fontSize: 14, color: '#666', marginTop: 8, textAlign: 'center' },\n});\n\nexport default WebKYCEntry;"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanctum-key/react-native-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.59",
|
|
4
4
|
"description": "Sanctum Key React Native SDK",
|
|
5
5
|
"main": "build/src/index.js",
|
|
6
6
|
"types": "build/src/index.d.ts",
|
|
@@ -59,11 +59,16 @@
|
|
|
59
59
|
"zustand": "^5.0.8"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
|
+
"@react-native-async-storage/async-storage": "^3.1.1",
|
|
62
63
|
"@types/crypto-js": "^4.2.2",
|
|
63
64
|
"@types/react": "~19.1.0",
|
|
64
65
|
"copyfiles": "^2.4.1",
|
|
65
66
|
"expo": "~54.0.0",
|
|
67
|
+
"expo-application": "^57.0.2",
|
|
68
|
+
"expo-device": "^57.0.1",
|
|
69
|
+
"expo-localization": "^57.0.1",
|
|
66
70
|
"expo-module-scripts": "^4.1.10",
|
|
71
|
+
"posthog-react-native": "^4.68.0",
|
|
67
72
|
"react-native": "0.81.5"
|
|
68
73
|
},
|
|
69
74
|
"peerDependencies": {
|
|
@@ -73,6 +78,11 @@
|
|
|
73
78
|
"react": "*",
|
|
74
79
|
"react-native": "*",
|
|
75
80
|
"react-native-svg": "*",
|
|
76
|
-
"react-native-vision-camera": "^4.7.1"
|
|
81
|
+
"react-native-vision-camera": "^4.7.1",
|
|
82
|
+
"posthog-react-native": "^3.0.0",
|
|
83
|
+
"@react-native-async-storage/async-storage": ">=1.18.0",
|
|
84
|
+
"expo-application": ">=5.0.0",
|
|
85
|
+
"expo-device": ">=5.0.0",
|
|
86
|
+
"expo-localization": ">=14.0.0"
|
|
77
87
|
}
|
|
78
88
|
}
|
|
@@ -294,6 +294,10 @@ export const EnhancedCameraView: React.FC<ExtendedCameraProps> = ({
|
|
|
294
294
|
style={StyleSheet.absoluteFill}
|
|
295
295
|
device={device}
|
|
296
296
|
resizeMode="cover"
|
|
297
|
+
// Keep the captured pixels in the same orientation as the preview and
|
|
298
|
+
// its document guide. The default "device" mode can save a landscape
|
|
299
|
+
// photo while a rotation-locked app is still displaying portrait.
|
|
300
|
+
outputOrientation="preview"
|
|
297
301
|
isActive={showCamera && !isProcessing && appState === 'active'}
|
|
298
302
|
photo={true}
|
|
299
303
|
photoQualityBalance={isScanningBarcode ? 'quality' : 'balanced'}
|