datakeen-session-react 1.1.168 → 1.1.170
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/dist/cjs/components/document-collection/DocumentCollection.js +1 -1
- package/dist/cjs/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/cjs/components/document-collection/DocumentCollectionUpload.js +9 -1
- package/dist/cjs/components/document-collection/DocumentCollectionUpload.js.map +1 -1
- package/dist/cjs/components/jdi/JDIDocumentUpload.js +1 -1
- package/dist/cjs/components/jdi/JDIDocumentUpload.js.map +1 -1
- package/dist/cjs/components/session/DocumentCheck.js +13 -2
- package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.js +1 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.js.map +1 -1
- package/dist/cjs/hooks/useUserInputForm.js +18 -5
- package/dist/cjs/hooks/useUserInputForm.js.map +1 -1
- package/dist/cjs/services/analysis.js +1 -5
- package/dist/cjs/services/analysis.js.map +1 -1
- package/dist/cjs/services/auditTrailService.js +73 -0
- package/dist/cjs/services/auditTrailService.js.map +1 -1
- package/dist/cjs/utils/labelToKey.js +28 -0
- package/dist/cjs/utils/labelToKey.js.map +1 -0
- package/dist/esm/components/document-collection/DocumentCollection.js +1 -1
- package/dist/esm/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/esm/components/document-collection/DocumentCollectionUpload.js +9 -1
- package/dist/esm/components/document-collection/DocumentCollectionUpload.js.map +1 -1
- package/dist/esm/components/jdi/JDIDocumentUpload.js +1 -1
- package/dist/esm/components/jdi/JDIDocumentUpload.js.map +1 -1
- package/dist/esm/components/session/DocumentCheck.js +13 -2
- package/dist/esm/components/session/DocumentCheck.js.map +1 -1
- package/dist/esm/components/template/TemplateNodeRenderer.js +1 -1
- package/dist/esm/components/template/TemplateNodeRenderer.js.map +1 -1
- package/dist/esm/hooks/useUserInputForm.js +18 -5
- package/dist/esm/hooks/useUserInputForm.js.map +1 -1
- package/dist/esm/services/analysis.js +1 -5
- package/dist/esm/services/analysis.js.map +1 -1
- package/dist/esm/services/auditTrailService.js +67 -1
- package/dist/esm/services/auditTrailService.js.map +1 -1
- package/dist/esm/utils/labelToKey.js +26 -0
- package/dist/esm/utils/labelToKey.js.map +1 -0
- package/examples/sdk-configuration.ts +8 -4
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.js","sources":["../../../../src/services/analysis.ts"],"sourcesContent":["import type { onUploadFiles } from \"../types/uploadFiles\";\nimport { dataURLtoFile, getMimeTypeFromDataURL } from \"./utils\";\nimport { mimeTypeToExtension } from \"../utils/mimeTypes\";\nimport { apiService } from \"./api\";\nimport type { SelfieCaptureData } from \"../types/selfie\";\nimport type {\n DocumentVideoCaptureBySide,\n DocumentVideoPreviewBySide,\n} from \"../types/documentVideo\";\nimport { getSessionMemoryUserInput } from \"./sessionMemoryStore\";\nimport {\n logDocumentUploaded,\n logSelfieCaptured,\n logAiControlled,\n logStatusModified,\n} from \"./auditTrailService\";\nimport { pollAnalysisStatus, stopPolling } from \"./pollingService\";\nimport type { PollingOptions } from \"./pollingService\";\n\n// Timeout configurations (in milliseconds)\nconst ANALYSIS_TIMEOUT = 600000; // 10 minutes for document analysis (increased for large files + ML processing)\nconst SELFIE_ANALYSIS_TIMEOUT = 600000; // 10 minutes for selfie analysis\nconst UPLOAD_TIMEOUT = 300000; // 5 minutes for file uploads\n\n// Map pour suivre les analyses en cours et éviter les doublons\nconst ongoingAnalyses = new Map<string, Promise<any>>();\n\nexport interface AnalyzeFilesOptions {\n personPhoto?: string | null;\n save?: boolean;\n incrementAnalysis?: boolean;\n forceUpload?: boolean;\n documentTypeKey?: string | null;\n requiresTwoSides?: boolean;\n enablePolling?: boolean; // Enable polling for analysis progress (default: true)\n pollingOptions?: PollingOptions; // Custom polling configuration\n collectOnly?: boolean; // Bypass AI verification — document is collected as-is\n}\n\ninterface LaunchAnalysisOptions extends AnalyzeFilesOptions {}\n\nfunction createFileName(fileURL: string, baseName: string = \"file\") {\n const mimeType = getMimeTypeFromDataURL(fileURL);\n if (!mimeType) {\n throw new Error(\"Unable to determine MIME type from file URL\");\n }\n\n const ext = mimeTypeToExtension(mimeType);\n const safeBase = baseName.replace(/\\.+$/, \"\");\n return ext ? `${safeBase}.${ext}` : safeBase;\n}\n\nfunction normalizeDocumentTypeKey(\n rawType?: string | null,\n fallback: string = \"document\",\n) {\n if (!rawType) {\n return fallback;\n }\n\n const trimmed = rawType.trim();\n if (!trimmed) {\n return fallback;\n }\n\n const withUnderscores = trimmed\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[\\s-]+/g, \"_\")\n .replace(/[^a-zA-Z0-9_]/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toLowerCase();\n\n return withUnderscores || fallback;\n}\n\n// Fonction pour créer une clé unique pour identifier une analyse\nfunction createAnalysisKey(\n sessionId: string,\n files: onUploadFiles,\n documentTypeId: string,\n): string {\n const frontHash = files.front ? files.front.substring(0, 50) : \"no-front\";\n const backHash = files.back ? files.back.substring(0, 50) : \"no-back\";\n return `${sessionId}-${documentTypeId}-${frontHash}-${backHash}`;\n}\n\nasync function launchAnalysis(\n sessionId: string,\n nodeId: string,\n files: onUploadFiles,\n documentTypeId: string | null,\n options: LaunchAnalysisOptions = {},\n) {\n if (!sessionId || !files) {\n throw new Error(\"Invalid parameters for analysis\");\n }\n\n const {\n personPhoto = null,\n save = true,\n incrementAnalysis = true,\n forceUpload = false,\n documentTypeKey = null,\n requiresTwoSides,\n collectOnly = false,\n } = options;\n\n const formData = new FormData();\n formData.append(\"sessionId\", sessionId);\n formData.append(\"nodeId\", nodeId);\n formData.append(\"save\", String(save));\n\n const userInput = getSessionMemoryUserInput(sessionId);\n if (Object.keys(userInput).length > 0) {\n const fullName = `${userInput.firstName || \"\"} ${\n userInput.lastName || \"\"\n }`.trim();\n formData.append(\"name\", fullName || \"Unknown\");\n\n formData.append(\"firstName\", userInput.firstName || \"\");\n formData.append(\"lastName\", userInput.lastName || \"\");\n formData.append(\"birthDate\", userInput.birthDate || \"\");\n formData.append(\"countryCode\", userInput.countryCode || \"\");\n }\n\n const fileTypes: Record<string, string> = {};\n const normalizedDocumentType = normalizeDocumentTypeKey(\n documentTypeKey ?? documentTypeId ?? undefined,\n );\n const hyphenDocumentType = normalizedDocumentType.replace(/_/g, \"-\");\n const appendSide =\n typeof requiresTwoSides === \"boolean\"\n ? requiresTwoSides\n : Boolean(files.back);\n\n if (files.front) {\n const frontBaseName = appendSide\n ? `${normalizedDocumentType}_front`\n : normalizedDocumentType;\n const frontFileName = createFileName(files.front, frontBaseName);\n const frontFile = dataURLtoFile(files.front, frontFileName);\n formData.append(\"files\", frontFile, frontFileName);\n\n fileTypes[frontFileName] = appendSide\n ? `${hyphenDocumentType}-front`\n : hyphenDocumentType;\n }\n\n if (files.back) {\n const backBaseName = `${normalizedDocumentType}_back`;\n const backFileName = createFileName(files.back, backBaseName);\n const backFile = dataURLtoFile(files.back, backFileName);\n formData.append(\"files\", backFile, backFileName);\n\n fileTypes[backFileName] = `${hyphenDocumentType}-back`;\n }\n\n formData.append(\"fileTypes\", JSON.stringify(fileTypes));\n formData.append(\"incrementAnalysis\", String(incrementAnalysis));\n formData.append(\"forceUpload\", String(forceUpload));\n\n if (documentTypeId) {\n formData.append(\"documentTemplateId\", documentTypeId);\n }\n\n if (personPhoto) {\n formData.append(\"personPhoto\", personPhoto);\n }\n\n if (collectOnly) {\n formData.append(\"collectOnly\", \"true\");\n }\n\n console.debug(\"FormData prepared for analysis:\", {\n sessionId,\n documentTypeId,\n files: Object.keys(fileTypes),\n save,\n incrementAnalysis,\n forceUpload,\n collectOnly,\n });\n return formData;\n}\n\nexport async function analyzeFiles(\n sessionId: string,\n nodeId: string,\n files: onUploadFiles,\n documentTypeId: string,\n options: AnalyzeFilesOptions = {},\n): Promise<any> {\n // Validate required parameters\n if (!sessionId) {\n throw new Error(\"Missing sessionId: A valid session ID is required.\");\n }\n if (!files || Object.keys(files).length === 0) {\n throw new Error(\n \"Missing files: At least one file must be provided for analysis.\",\n );\n }\n\n const {\n personPhoto = null,\n save = true,\n incrementAnalysis = true,\n forceUpload = false,\n documentTypeKey = null,\n requiresTwoSides,\n enablePolling = true,\n pollingOptions = {},\n collectOnly = false,\n } = options;\n\n // Pour les retry, on ne force pas l'upload mais on écrase l'analyse existante\n const isRetry = !incrementAnalysis && !forceUpload;\n\n // Créer une clé unique pour cette analyse\n const analysisKey = createAnalysisKey(sessionId, files, documentTypeId);\n\n // Vérifier si une analyse identique est déjà en cours\n if (ongoingAnalyses.has(analysisKey) && !isRetry) {\n return ongoingAnalyses.get(analysisKey);\n }\n\n // Helper function for retry logic with exponential backoff\n async function submitAnalysisWithRetry(\n formData: FormData,\n maxAttempts: number = 3,\n ) {\n let lastError: any;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const rawClient = apiService.getRawClient();\n\n const response = await rawClient.post(\n `/session/sdk/${sessionId}/analysis`,\n formData,\n {\n timeout: ANALYSIS_TIMEOUT,\n },\n );\n\n return response;\n } catch (error: any) {\n lastError = error;\n\n // Check if it's a network error (likely backend didn't respond in time)\n if (\n error.code === \"ERR_NETWORK\" ||\n error.message?.includes(\"CORS request did not succeed\")\n ) {\n console.warn(\n `⚠️ Network error on attempt ${attempt}: ${error.message}`,\n );\n\n if (attempt < maxAttempts) {\n // Exponential backoff: wait 2s, 4s, 8s...\n const waitTime = Math.pow(2, attempt) * 1000;\n console.log(`⏳ Retrying in ${waitTime / 1000}s...`);\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n continue;\n }\n }\n\n // For other errors, don't retry\n throw error;\n }\n }\n\n throw lastError;\n }\n\n // Créer la promesse d'analyse et la stocker\n const analysisPromise = (async () => {\n try {\n const formData = await launchAnalysis(\n sessionId,\n nodeId,\n files,\n documentTypeId,\n {\n personPhoto,\n save,\n incrementAnalysis: isRetry ? false : incrementAnalysis,\n forceUpload: isRetry ? true : forceUpload,\n documentTypeKey,\n requiresTwoSides,\n collectOnly,\n },\n );\n\n await logDocumentUploaded(sessionId, {\n documentTypeId: documentTypeId || \"unknown\",\n hasFrontImage: !!files.front,\n hasBackImage: !!files.back,\n });\n\n // Submit with automatic retry on network errors\n const response = await submitAnalysisWithRetry(formData);\n\n // Wrap response to match ApiResponse type\n const wrappedResponse = {\n data: response.data,\n success: true,\n status: response.status,\n };\n\n await logAiControlled(\n sessionId,\n {\n analysisResult: response.data.status || \"unknown\",\n documentTypeId: documentTypeId || \"unknown\",\n },\n response.data.clientInfoId || undefined,\n );\n\n if (!wrappedResponse.success) {\n throw new Error(`Analysis failed: ${response.data}`);\n }\n\n // Start polling for analysis progress if enabled\n if (enablePolling) {\n try {\n const pollConfig: PollingOptions = {\n ...pollingOptions,\n };\n\n const pollingResult = await pollAnalysisStatus(sessionId, pollConfig);\n\n return pollingResult;\n } catch (pollError) {\n console.warn(\n \"⚠️ Polling error (analysis may still be processing):\",\n pollError,\n );\n // Don't throw - polling error shouldn't fail the analysis submission\n // The backend is still processing even if polling fails\n return response.data;\n }\n }\n\n return response.data;\n } catch (error) {\n console.error(\"❌ Analysis failed:\", error);\n // Stop any ongoing polling on error\n stopPolling();\n throw error;\n } finally {\n // Nettoyer la promesse de la map une fois terminée\n ongoingAnalyses.delete(analysisKey);\n }\n })();\n\n // Stocker la promesse pour éviter les appels simultanés\n ongoingAnalyses.set(analysisKey, analysisPromise);\n\n return analysisPromise;\n}\n\nexport async function analyzeSelfie(\n sessionId: string,\n selfieFile: SelfieCaptureData,\n selfiePhoto: string,\n): Promise<any> {\n console.log(\"🤳 Starting selfie analysis for session:\", sessionId);\n console.log(\"� File size:\", selfieFile.media.size, \"bytes\");\n\n const formData = new FormData();\n formData.append(\"file\", selfieFile.media, \"selfie.mp4\");\n formData.append(\"photo\", selfiePhoto);\n\n try {\n console.log(\"🚀 Sending selfie to UNISSEY API...\");\n\n const response = await apiService.post(\n `/session/unissey/${sessionId}/analyze`,\n formData,\n {\n timeout: SELFIE_ANALYSIS_TIMEOUT,\n },\n );\n\n console.log(\"✅ Analysis response:\", response);\n\n // Si la réponse API indique un succès, traiter la réponse Unissey\n if (response.success && response.data) {\n console.log(\"🎉 Unissey analysis completed - checking results...\");\n\n // response.data contient directement la réponse Unissey avec status, message, data\n const unisseyResponse = response.data;\n\n // Vérifier si Unissey a répondu avec succès\n if (\n unisseyResponse.status === 200 &&\n (unisseyResponse.message === \"success\" ||\n unisseyResponse.message === \"ok\")\n ) {\n console.log(\"✅ Unissey returned success status\");\n\n // Utiliser les données réelles de la réponse Unissey\n const unisseyData = unisseyResponse.data;\n\n // Vérifier si la comparaison faciale a un niveau de confiance élevé\n const faceComparison = unisseyData.details?.face_comparison;\n const isHighConfidence = faceComparison?.confidence_level === \"high\";\n const isMatch =\n unisseyData.is_match && faceComparison?.result === \"match\";\n\n // is_genuine est basé sur la confiance élevée de la comparaison faciale\n const isGenuine = isHighConfidence && isMatch;\n\n // Log selfie captured in audit trail\n try {\n const analysisResponse = await apiService.get(\n `/session/sdk/${sessionId}`,\n );\n if (analysisResponse.data && analysisResponse.data.analysisId) {\n await logSelfieCaptured(\n sessionId,\n analysisResponse.data.clientInfoId || undefined,\n );\n\n // Log AI control with selfie analysis results\n await logAiControlled(\n sessionId,\n {\n selfieAnalysisResult: isGenuine ? \"genuine\" : \"not_genuine\",\n isMatch: isMatch ? \"match\" : \"no_match\",\n confidenceLevel: faceComparison?.confidence_level || \"unknown\",\n },\n analysisResponse.data.clientInfoId || undefined,\n );\n\n await logStatusModified(\n sessionId,\n {\n selfieAnalysisResult: isGenuine ? \"genuine\" : \"not_genuine\",\n isMatch: isMatch ? \"match\" : \"no_match\",\n confidenceLevel: faceComparison?.confidence_level || \"unknown\",\n },\n analysisResponse.data.clientInfoId || undefined,\n );\n }\n } catch (err) {\n console.error(\"Failed to log selfie capture in audit trail:\", err);\n // Non-blocking error - continue analysis\n }\n\n // Retourner la structure attendue par l'UI\n return {\n success: true,\n data: {\n ...unisseyData,\n is_genuine: isGenuine, // Basé sur confidence_level === \"high\"\n },\n };\n } else {\n console.error(\n \"❌ Unissey returned error status:\",\n unisseyResponse.status,\n unisseyResponse.message,\n );\n throw new Error(\n `Unissey analysis failed: ${\n unisseyResponse.message || \"Unknown Unissey error\"\n }`,\n );\n }\n }\n\n // Gestion des erreurs spécifiques API\n const errorMessage =\n response.data?.message || response.data || \"Unknown error\";\n console.error(\"❌ API call failed:\", errorMessage);\n throw new Error(`Face comparison analysis failed: ${errorMessage}`);\n } catch (error: any) {\n console.error(\"💥 Analysis error:\", error);\n\n // Améliorer le message d'erreur pour l'UI\n if (error.response?.data?.message) {\n throw new Error(`Analysis failed: ${error.response.data.message}`);\n } else if (error.message) {\n throw error; // Garder le message d'erreur original si déjà formaté\n } else {\n throw new Error(\n \"Face comparison analysis failed due to an unexpected error\",\n );\n }\n }\n}\n\nexport async function uploadConvertedIdCardImage(\n sessionId: string,\n file: File,\n): Promise<any> {\n if (!sessionId || !file) {\n throw new Error(\"Invalid parameters for uploading converted ID card image\");\n }\n\n // rename file to converted_id_card.png\n const renamedFile = new File([file], \"converted_id_card.png\", {\n type: file.type,\n });\n\n const formData = new FormData();\n formData.append(\"file\", renamedFile, renamedFile.name);\n\n try {\n console.log(\n `🚀 Uploading converted ID card image for session: ${sessionId}`,\n );\n const response = await apiService.post(\n `/session/sdk/${sessionId}/converted_id_card.png`,\n formData,\n {\n timeout: UPLOAD_TIMEOUT,\n },\n );\n console.log(\"✅ Upload response:\", response);\n return response.data;\n } catch (error) {\n console.error(\"❌ Upload error:\", error);\n throw new Error(\"Failed to upload converted ID card image\");\n }\n}\n\n/**\n * Analyzes a document video captured with Unissey DOC_VIDEO preset.\n * Sends the video file and thumbnail to the backend for document verification.\n *\n * @param sessionId - Unique identifier for the current session\n * @param nodeId - Identifier for the current node in the journey\n * @param videoData - Document video capture data containing media blob and metadata\n * @param thumbnail - Base64 thumbnail extracted from the video\n * @param documentTemplateId - Template ID for the document type being verified\n * @returns Analysis response from the backend\n */\nexport async function analyzeDocumentVideo(\n sessionId: string,\n nodeId: string,\n videoData: DocumentVideoCaptureBySide,\n previews: DocumentVideoPreviewBySide,\n documentTemplateId: string,\n options: {\n documentType?: string;\n requiresTwoSides?: boolean;\n enablePolling?: boolean;\n pollingOptions?: PollingOptions;\n } = {},\n): Promise<any> {\n if (!videoData.recto || !previews.recto) {\n throw new Error(\"Missing recto video or preview\");\n }\n\n const normalizedDocumentType = normalizeDocumentTypeKey(\n options.documentType ?? documentTemplateId ?? undefined,\n );\n const hyphenDocumentType = normalizedDocumentType.replace(/_/g, \"-\");\n const appendSide =\n typeof options.requiresTwoSides === \"boolean\"\n ? options.requiresTwoSides\n : Boolean(videoData.verso || previews.verso);\n\n const frontBaseName = appendSide\n ? `${normalizedDocumentType}_front`\n : normalizedDocumentType;\n const backBaseName = `${normalizedDocumentType}_back`;\n\n const previewFrontFileName = `${frontBaseName}.jpg`;\n const previewFrontFile = dataURLtoFile(previews.recto, previewFrontFileName);\n const previewBackFileName = `${backBaseName}.jpg`;\n const previewBackFile = previews.verso\n ? dataURLtoFile(previews.verso, previewBackFileName)\n : null;\n\n const formData = new FormData();\n\n formData.append(\n \"videoFront\",\n videoData.recto.media,\n \"document_video_recto.mp4\",\n );\n if (videoData.verso) {\n formData.append(\n \"videoBack\",\n videoData.verso.media,\n \"document_video_verso.mp4\",\n );\n }\n\n formData.append(\"previewFront\", previewFrontFile, previewFrontFileName);\n if (previewBackFile) {\n formData.append(\"previewBack\", previewBackFile, previewBackFileName);\n }\n\n const fileTypes: Record<string, string> = {};\n fileTypes[previewFrontFileName] = appendSide\n ? `${hyphenDocumentType}-front`\n : hyphenDocumentType;\n if (previewBackFile) {\n fileTypes[previewBackFileName] = `${hyphenDocumentType}-back`;\n }\n\n formData.append(\"fileTypes\", JSON.stringify(fileTypes));\n formData.append(\"sessionId\", sessionId);\n formData.append(\"nodeId\", nodeId);\n formData.append(\"documentTemplateId\", documentTemplateId);\n formData.append(\"documentType\", options.documentType || \"\");\n formData.append(\"requiresTwoSides\", String(appendSide));\n formData.append(\"save\", \"true\");\n\n const { enablePolling = true, pollingOptions = {} } = options;\n\n try {\n console.log(\"🚀 Sending document video to document-video API...\");\n const response = await apiService.post(\n `/session/sdk/${sessionId}/document-video`,\n formData,\n { timeout: ANALYSIS_TIMEOUT },\n );\n\n if (enablePolling) {\n try {\n const pollConfig: PollingOptions = {\n ...pollingOptions,\n defaultValue: {\n sessionId,\n status: \"processing\",\n progress: 50,\n currentStep: \"processing\",\n message: \"Document analysis in progress\",\n analysisId: null,\n startedAt: new Date().toISOString(),\n completedAt: null,\n error: null,\n },\n };\n const pollingResult = await pollAnalysisStatus(sessionId, pollConfig);\n return pollingResult;\n } catch (pollError) {\n console.warn(\n \"⚠️ Polling error (document-video may still be processing):\",\n pollError,\n );\n }\n }\n\n if (response?.success || response?.data?.success) {\n return response.data ?? response;\n }\n\n const errorMessage = response?.data?.message || \"Unknown error\";\n throw new Error(`Document video analysis failed: ${errorMessage}`);\n } catch (error: any) {\n stopPolling();\n if (error.response?.data?.message) {\n throw new Error(`Analysis failed: ${error.response.data.message}`);\n }\n if (error.message) {\n throw error;\n }\n throw new Error(\n \"Document video analysis failed due to an unexpected error\",\n );\n }\n}\n"],"names":[],"mappings":";;;;;;;;AAmBA;AACA,IAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,IAAM,uBAAuB,GAAG,MAAM,CAAC;AACvC,IAAM,cAAc,GAAG,MAAM,CAAC;AAE9B;AACA,IAAM,eAAe,GAAG,IAAI,GAAG,EAAwB;AAgBvD,SAAS,cAAc,CAAC,OAAe,EAAE,QAAyB,EAAA;AAAzB,IAAA,IAAA,QAAA,KAAA,MAAA,EAAA,EAAA,QAAA,GAAA,MAAyB,CAAA,CAAA;AAChE,IAAA,IAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAChD,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC;IAChE;AAEA,IAAA,IAAM,GAAG,GAAG,mBAAmB,CAAC,QAAQ,CAAC;IACzC,IAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAC7C,IAAA,OAAO,GAAG,GAAG,EAAA,CAAA,MAAA,CAAG,QAAQ,EAAA,GAAA,CAAA,CAAA,MAAA,CAAI,GAAG,CAAE,GAAG,QAAQ;AAC9C;AAEA,SAAS,wBAAwB,CAC/B,OAAuB,EACvB,QAA6B,EAAA;AAA7B,IAAA,IAAA,QAAA,KAAA,MAAA,EAAA,EAAA,QAAA,GAAA,UAA6B,CAAA,CAAA;IAE7B,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,OAAO,QAAQ;IACjB;AAEA,IAAA,IAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE;IAC9B,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,OAAO,QAAQ;IACjB;IAEA,IAAM,eAAe,GAAG;AACrB,SAAA,OAAO,CAAC,oBAAoB,EAAE,OAAO;AACrC,SAAA,OAAO,CAAC,SAAS,EAAE,GAAG;AACtB,SAAA,OAAO,CAAC,gBAAgB,EAAE,GAAG;AAC7B,SAAA,OAAO,CAAC,KAAK,EAAE,GAAG;AAClB,SAAA,OAAO,CAAC,UAAU,EAAE,EAAE;AACtB,SAAA,WAAW,EAAE;IAEhB,OAAO,eAAe,IAAI,QAAQ;AACpC;AAEA;AACA,SAAS,iBAAiB,CACxB,SAAiB,EACjB,KAAoB,EACpB,cAAsB,EAAA;IAEtB,IAAM,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,UAAU;IACzE,IAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS;IACrE,OAAO,EAAA,CAAA,MAAA,CAAG,SAAS,EAAA,GAAA,CAAA,CAAA,MAAA,CAAI,cAAc,cAAI,SAAS,EAAA,GAAA,CAAA,CAAA,MAAA,CAAI,QAAQ,CAAE;AAClE;AAEA,SAAe,cAAc,CAAA,WAAA,EAAA,QAAA,EAAA,OAAA,EAAA,gBAAA,EAAA;AAC3B,IAAA,OAAA,SAAA,CAAA,IAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,SAAiB,EACjB,MAAc,EACd,KAAoB,EACpB,cAA6B,EAC7B,OAAmC,EAAA;;;AAAnC,QAAA,IAAA,OAAA,KAAA,MAAA,EAAA,EAAA,OAAA,GAAA,EAAmC,CAAA,CAAA;;AAEnC,YAAA,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE;AACxB,gBAAA,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC;YACpD;YAGE,EAAA,GAOE,OAAO,CAAA,WAPS,EAAlB,WAAW,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,GAAA,EAAA,EAClB,EAAA,GAME,OAAO,CAAA,IANE,EAAX,IAAI,mBAAG,IAAI,GAAA,EAAA,EACX,EAAA,GAKE,OAAO,CAAA,iBALe,EAAxB,iBAAiB,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,GAAA,EAAA,EACxB,EAAA,GAIE,OAAO,YAJU,EAAnB,WAAW,GAAA,EAAA,KAAA,MAAA,GAAG,KAAK,GAAA,EAAA,EACnB,EAAA,GAGE,OAAO,CAAA,eAHa,EAAtB,eAAe,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,GAAA,EAAA,EACtB,gBAAgB,GAEd,OAAO,CAAA,gBAFO,EAChB,EAAA,GACE,OAAO,CAAA,WADU,EAAnB,WAAW,GAAA,EAAA,KAAA,MAAA,GAAG,KAAK,GAAA,EAAA;AAGf,YAAA,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAC/B,YAAA,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC;AACvC,YAAA,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;YACjC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAE/B,YAAA,SAAS,GAAG,yBAAyB,CAAC,SAAS,CAAC;YACtD,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/B,gBAAA,QAAQ,GAAG,EAAA,CAAA,MAAA,CAAG,SAAS,CAAC,SAAS,IAAI,EAAE,EAAA,GAAA,CAAA,CAAA,MAAA,CAC3C,SAAS,CAAC,QAAQ,IAAI,EAAE,CACxB,CAAC,IAAI,EAAE;gBACT,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,SAAS,CAAC;gBAE9C,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;gBACvD,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACrD,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;gBACvD,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC;YAC7D;YAEM,SAAS,GAA2B,EAAE;AACtC,YAAA,sBAAsB,GAAG,wBAAwB,CACrD,CAAA,EAAA,GAAA,eAAe,KAAA,IAAA,IAAf,eAAe,KAAA,MAAA,GAAf,eAAe,GAAI,cAAc,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,SAAS,CAC/C;YACK,kBAAkB,GAAG,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAC9D,YAAA,UAAU,GACd,OAAO,gBAAgB,KAAK;AAC1B,kBAAE;AACF,kBAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;AAEzB,YAAA,IAAI,KAAK,CAAC,KAAK,EAAE;AACT,gBAAA,aAAa,GAAG;sBAClB,EAAA,CAAA,MAAA,CAAG,sBAAsB,EAAA,QAAA;sBACzB,sBAAsB;gBACpB,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC;gBAC1D,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC;gBAC3D,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC;AAElD,gBAAA,SAAS,CAAC,aAAa,CAAC,GAAG;sBACvB,EAAA,CAAA,MAAA,CAAG,kBAAkB,EAAA,QAAA;sBACrB,kBAAkB;YACxB;AAEA,YAAA,IAAI,KAAK,CAAC,IAAI,EAAE;AACR,gBAAA,YAAY,GAAG,EAAA,CAAA,MAAA,CAAG,sBAAsB,EAAA,OAAA,CAAO;gBAC/C,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC;gBACvD,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC;gBACxD,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC;AAEhD,gBAAA,SAAS,CAAC,YAAY,CAAC,GAAG,EAAA,CAAA,MAAA,CAAG,kBAAkB,UAAO;YACxD;AAEA,YAAA,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACvD,QAAQ,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC/D,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YAEnD,IAAI,cAAc,EAAE;AAClB,gBAAA,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,cAAc,CAAC;YACvD;YAEA,IAAI,WAAW,EAAE;AACf,gBAAA,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC;YAC7C;YAEA,IAAI,WAAW,EAAE;AACf,gBAAA,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC;YACxC;AAEA,YAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE;AAC/C,gBAAA,SAAS,EAAA,SAAA;AACT,gBAAA,cAAc,EAAA,cAAA;AACd,gBAAA,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;AAC7B,gBAAA,IAAI,EAAA,IAAA;AACJ,gBAAA,iBAAiB,EAAA,iBAAA;AACjB,gBAAA,WAAW,EAAA,WAAA;AACX,gBAAA,WAAW,EAAA,WAAA;AACZ,aAAA,CAAC;AACF,YAAA,OAAA,CAAA,CAAA,aAAO,QAAQ,CAAA;;;AAChB;SAEqB,YAAY,CAAA,WAAA,EAAA,QAAA,EAAA,OAAA,EAAA,gBAAA,EAAA;AAChC,IAAA,OAAA,SAAA,CAAA,IAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,SAAiB,EACjB,MAAc,EACd,KAAoB,EACpB,cAAsB,EACtB,OAAiC,EAAA;;AAoCjC,QAAA,SAAe,uBAAuB,CAAA,UAAA,EAAA;AACpC,YAAA,OAAA,SAAA,CAAA,IAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,QAAkB,EAClB,WAAuB,EAAA;;;AAAvB,gBAAA,IAAA,WAAA,KAAA,MAAA,EAAA,EAAA,WAAA,GAAA,CAAuB,CAAA,CAAA;;;;gDAId,OAAO,EAAA;;;;;;AAEN,4CAAA,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE;4CAE1B,OAAA,CAAA,CAAA,YAAM,SAAS,CAAC,IAAI,CACnC,uBAAgB,SAAS,EAAA,WAAA,CAAW,EACpC,QAAQ,EACR;AACE,oDAAA,OAAO,EAAE,gBAAgB;AAC1B,iDAAA,CACF,CAAA;;AANK,4CAAA,QAAQ,GAAG,EAAA,CAAA,IAAA,EAMhB;2EAEM,QAAQ,EAAA,CAAA;;;4CAEf,SAAS,GAAG,OAAK;AAIf,4CAAA,IAAA,EAAA,OAAK,CAAC,IAAI,KAAK,aAAa;iDAC5B,CAAA,EAAA,GAAA,OAAK,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,QAAQ,CAAC,8BAA8B,CAAC,CAAA,CAAA,EADvD,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;4CAGA,OAAO,CAAC,IAAI,CACV,wCAAA,CAAA,MAAA,CAA+B,OAAO,EAAA,IAAA,CAAA,CAAA,MAAA,CAAK,OAAK,CAAC,OAAO,CAAE,CAC3D;AAEG,4CAAA,IAAA,EAAA,OAAO,GAAG,WAAW,CAAA,EAArB,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;4CAEI,UAAA,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI;4CAC5C,OAAO,CAAC,GAAG,CAAC,qBAAA,CAAA,MAAA,CAAiB,UAAQ,GAAG,IAAI,EAAA,MAAA,CAAM,CAAC;AACnD,4CAAA,OAAA,CAAA,CAAA,YAAM,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,UAAQ,CAAC,CAAA,CAA7B,CAA6B,CAAC,CAAA;;AAA7D,4CAAA,EAAA,CAAA,IAAA,EAA6D;;;;AAMjE,wCAAA,MAAM,OAAK;;;;;AAnCN,4BAAA,OAAO,GAAG,CAAC;;;kCAAE,OAAO,IAAI,WAAW,CAAA,EAAA,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;0DAAnC,OAAO,CAAA,CAAA;;;;;;;AAA8B,4BAAA,OAAO,EAAE;;AAuCvD,wBAAA,KAAA,CAAA,EAAA,MAAM,SAAS;;;;AAChB,QAAA;;;AAlFD,QAAA,IAAA,OAAA,KAAA,MAAA,EAAA,EAAA,OAAA,GAAA,EAAiC,CAAA,CAAA;;;YAGjC,IAAI,CAAC,SAAS,EAAE;AACd,gBAAA,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC;YACvE;AACA,YAAA,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7C,gBAAA,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE;YACH;AAGE,YAAA,EAAA,GASE,OAAO,CAAA,WATS,EAAlB,WAAW,mBAAG,IAAI,GAAA,EAAA,EAClB,EAAA,GAQE,OAAO,CAAA,IARE,EAAX,IAAI,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,GAAA,EAAA,EACX,EAAA,GAOE,OAAO,kBAPe,EAAxB,iBAAiB,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,KAAA,EACxB,EAAA,GAME,OAAO,CAAA,WANU,EAAnB,WAAW,GAAA,EAAA,KAAA,MAAA,GAAG,KAAK,GAAA,EAAA,EACnB,EAAA,GAKE,OAAO,CAAA,eALa,EAAtB,eAAe,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,GAAA,EAAA,EACtB,gBAAgB,GAId,OAAO,CAAA,gBAJO,EAChB,KAGE,OAAO,CAAA,aAHW,EAApB,aAAa,mBAAG,IAAI,GAAA,EAAA,EACpB,EAAA,GAEE,OAAO,CAAA,cAFU,EAAnB,cAAc,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,GAAA,EAAA,EACnB,EAAA,GACE,OAAO,YADU,EAAnB,WAAW,GAAA,EAAA,KAAA,MAAA,GAAG,KAAK,KAAA;AAIf,YAAA,OAAO,GAAG,CAAC,iBAAiB,IAAI,CAAC,WAAW;YAG5C,WAAW,GAAG,iBAAiB,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC;;YAGvE,IAAI,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE;AAChD,gBAAA,OAAA,CAAA,CAAA,aAAO,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YACzC;AAoDM,YAAA,eAAe,GAAG,CAAC,YAAA,EAAA,OAAA,SAAA,CAAA,KAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;;4BAEJ,OAAA,CAAA,CAAA,YAAM,cAAc,CACnC,SAAS,EACT,MAAM,EACN,KAAK,EACL,cAAc,EACd;AACE,oCAAA,WAAW,EAAA,WAAA;AACX,oCAAA,IAAI,EAAA,IAAA;oCACJ,iBAAiB,EAAE,OAAO,GAAG,KAAK,GAAG,iBAAiB;oCACtD,WAAW,EAAE,OAAO,GAAG,IAAI,GAAG,WAAW;AACzC,oCAAA,eAAe,EAAA,eAAA;AACf,oCAAA,gBAAgB,EAAA,gBAAA;AAChB,oCAAA,WAAW,EAAA,WAAA;AACZ,iCAAA,CACF,CAAA;;AAdK,4BAAA,QAAQ,GAAG,EAAA,CAAA,IAAA,EAchB;4BAED,OAAA,CAAA,CAAA,YAAM,mBAAmB,CAAC,SAAS,EAAE;oCACnC,cAAc,EAAE,cAAc,IAAI,SAAS;AAC3C,oCAAA,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK;AAC5B,oCAAA,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;AAC3B,iCAAA,CAAC,CAAA;;AAJF,4BAAA,EAAA,CAAA,IAAA,EAIE;AAGe,4BAAA,OAAA,CAAA,CAAA,YAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAA;;AAAlD,4BAAA,QAAQ,GAAG,EAAA,CAAA,IAAA,EAAuC;AAGlD,4BAAA,eAAe,GAAG;gCACtB,IAAI,EAAE,QAAQ,CAAC,IAAI;AACnB,gCAAA,OAAO,EAAE,IAAI;gCACb,MAAM,EAAE,QAAQ,CAAC,MAAM;6BACxB;4BAED,OAAA,CAAA,CAAA,YAAM,eAAe,CACnB,SAAS,EACT;AACE,oCAAA,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,SAAS;oCACjD,cAAc,EAAE,cAAc,IAAI,SAAS;iCAC5C,EACD,QAAQ,CAAC,IAAI,CAAC,YAAY,IAAI,SAAS,CACxC,CAAA;;AAPD,4BAAA,EAAA,CAAA,IAAA,EAOC;AAED,4BAAA,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE;gCAC5B,MAAM,IAAI,KAAK,CAAC,mBAAA,CAAA,MAAA,CAAoB,QAAQ,CAAC,IAAI,CAAE,CAAC;4BACtD;AAGI,4BAAA,IAAA,CAAA,aAAa,EAAb,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;;;;4BAEM,UAAU,GAAA,QAAA,CAAA,EAAA,EACX,cAAc,CAClB;AAEqB,4BAAA,OAAA,CAAA,CAAA,YAAM,kBAAkB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;;AAA/D,4BAAA,aAAa,GAAG,EAAA,CAAA,IAAA,EAA+C;AAErE,4BAAA,OAAA,CAAA,CAAA,aAAO,aAAa,CAAA;;;AAEpB,4BAAA,OAAO,CAAC,IAAI,CACV,sDAAsD,EACtD,WAAS,CACV;;;4BAGD,OAAA,CAAA,CAAA,aAAO,QAAQ,CAAC,IAAI,CAAA;gCAIxB,OAAA,CAAA,CAAA,aAAO,QAAQ,CAAC,IAAI,CAAA;;;AAEpB,4BAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,OAAK,CAAC;;AAE1C,4BAAA,WAAW,EAAE;AACb,4BAAA,MAAM,OAAK;;;AAGX,4BAAA,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC;;;;;AAEtC,YAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG;;AAGJ,YAAA,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC;AAEjD,YAAA,OAAA,CAAA,CAAA,aAAO,eAAe,CAAA;;;AACvB;SAEqB,aAAa,CACjC,SAAiB,EACjB,UAA6B,EAC7B,WAAmB,EAAA;;;;;;;AAEnB,oBAAA,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,SAAS,CAAC;AAClE,oBAAA,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AAErD,oBAAA,QAAQ,GAAG,IAAI,QAAQ,EAAE;oBAC/B,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC;AACvD,oBAAA,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC;;;;AAGnC,oBAAA,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC;oBAEjC,OAAA,CAAA,CAAA,YAAM,UAAU,CAAC,IAAI,CACpC,2BAAoB,SAAS,EAAA,UAAA,CAAU,EACvC,QAAQ,EACR;AACE,4BAAA,OAAO,EAAE,uBAAuB;AACjC,yBAAA,CACF,CAAA;;AANK,oBAAA,QAAQ,GAAG,EAAA,CAAA,IAAA,EAMhB;AAED,oBAAA,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,QAAQ,CAAC;0BAGzC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAA,EAAjC,OAAA,CAAA,CAAA,YAAA,EAAA,CAAA;AACF,oBAAA,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC;AAG5D,oBAAA,eAAe,GAAG,QAAQ,CAAC,IAAI;AAInC,oBAAA,IAAA,EAAA,eAAe,CAAC,MAAM,KAAK,GAAG;AAC9B,yBAAC,eAAe,CAAC,OAAO,KAAK,SAAS;AACpC,4BAAA,eAAe,CAAC,OAAO,KAAK,IAAI,CAAC,CAAA,EAFnC,OAAA,CAAA,CAAA,YAAA,EAAA,CAAA;AAIA,oBAAA,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC;AAG1C,oBAAA,WAAW,GAAG,eAAe,CAAC,IAAI;AAGlC,oBAAA,cAAc,GAAG,CAAA,EAAA,GAAA,WAAW,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,eAAe;oBACrD,gBAAgB,GAAG,CAAA,cAAc,KAAA,IAAA,IAAd,cAAc,KAAA,MAAA,GAAA,MAAA,GAAd,cAAc,CAAE,gBAAgB,MAAK,MAAM;AAC9D,oBAAA,OAAO,GACX,WAAW,CAAC,QAAQ,IAAI,CAAA,cAAc,KAAA,IAAA,IAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,MAAK,OAAO;AAGtD,oBAAA,SAAS,GAAG,gBAAgB,IAAI,OAAO;;;;oBAIlB,OAAA,CAAA,CAAA,YAAM,UAAU,CAAC,GAAG,CAC3C,uBAAgB,SAAS,CAAE,CAC5B,CAAA;;AAFK,oBAAA,gBAAgB,GAAG,EAAA,CAAA,IAAA,EAExB;0BACG,gBAAgB,CAAC,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAA,EAAzD,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;AACF,oBAAA,OAAA,CAAA,CAAA,YAAM,iBAAiB,CACrB,SAAS,EACT,gBAAgB,CAAC,IAAI,CAAC,YAAY,IAAI,SAAS,CAChD,CAAA;;AAHD,oBAAA,EAAA,CAAA,IAAA,EAGC;;oBAGD,OAAA,CAAA,CAAA,YAAM,eAAe,CACnB,SAAS,EACT;4BACE,oBAAoB,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa;4BAC3D,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU;4BACvC,eAAe,EAAE,CAAA,cAAc,KAAA,IAAA,IAAd,cAAc,uBAAd,cAAc,CAAE,gBAAgB,KAAI,SAAS;yBAC/D,EACD,gBAAgB,CAAC,IAAI,CAAC,YAAY,IAAI,SAAS,CAChD,CAAA;;;AARD,oBAAA,EAAA,CAAA,IAAA,EAQC;oBAED,OAAA,CAAA,CAAA,YAAM,iBAAiB,CACrB,SAAS,EACT;4BACE,oBAAoB,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa;4BAC3D,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU;4BACvC,eAAe,EAAE,CAAA,cAAc,KAAA,IAAA,IAAd,cAAc,uBAAd,cAAc,CAAE,gBAAgB,KAAI,SAAS;yBAC/D,EACD,gBAAgB,CAAC,IAAI,CAAC,YAAY,IAAI,SAAS,CAChD,CAAA;;AARD,oBAAA,EAAA,CAAA,IAAA,EAQC;;;;;AAGH,oBAAA,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAG,CAAC;;;;gBAKpE,OAAA,CAAA,CAAA,aAAO;AACL,wBAAA,OAAO,EAAE,IAAI;AACb,wBAAA,IAAI,wBACC,WAAW,CAAA,EAAA,EACd,UAAU,EAAE,SAAS,EAAA,CACtB;qBACF,CAAA;;AAED,oBAAA,OAAO,CAAC,KAAK,CACX,kCAAkC,EAClC,eAAe,CAAC,MAAM,EACtB,eAAe,CAAC,OAAO,CACxB;oBACD,MAAM,IAAI,KAAK,CACb,2BAAA,CAAA,MAAA,CACE,eAAe,CAAC,OAAO,IAAI,uBAAuB,CAClD,CACH;;AAKC,oBAAA,YAAY,GAChB,CAAA,CAAA,EAAA,GAAA,QAAQ,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,KAAI,QAAQ,CAAC,IAAI,IAAI,eAAe;AAC5D,oBAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,YAAY,CAAC;AACjD,oBAAA,MAAM,IAAI,KAAK,CAAC,2CAAoC,YAAY,CAAE,CAAC;;;AAEnE,oBAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,OAAK,CAAC;;oBAG1C,IAAI,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAK,CAAC,QAAQ,0CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,EAAE;AACjC,wBAAA,MAAM,IAAI,KAAK,CAAC,mBAAA,CAAA,MAAA,CAAoB,OAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAE,CAAC;oBACpE;AAAO,yBAAA,IAAI,OAAK,CAAC,OAAO,EAAE;wBACxB,MAAM,OAAK,CAAC;oBACd;yBAAO;AACL,wBAAA,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D;oBACH;;;;;AAEH;AAEK,SAAgB,0BAA0B,CAC9C,SAAiB,EACjB,IAAU,EAAA;;;;;;AAEV,oBAAA,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE;AACvB,wBAAA,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC;oBAC7E;oBAGM,WAAW,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,uBAAuB,EAAE;wBAC5D,IAAI,EAAE,IAAI,CAAC,IAAI;AAChB,qBAAA,CAAC;AAEI,oBAAA,QAAQ,GAAG,IAAI,QAAQ,EAAE;oBAC/B,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC;;;;AAGpD,oBAAA,OAAO,CAAC,GAAG,CACT,sEAAqD,SAAS,CAAE,CACjE;oBACgB,OAAA,CAAA,CAAA,YAAM,UAAU,CAAC,IAAI,CACpC,uBAAgB,SAAS,EAAA,wBAAA,CAAwB,EACjD,QAAQ,EACR;AACE,4BAAA,OAAO,EAAE,cAAc;AACxB,yBAAA,CACF,CAAA;;AANK,oBAAA,QAAQ,GAAG,EAAA,CAAA,IAAA,EAMhB;AACD,oBAAA,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,QAAQ,CAAC;oBAC3C,OAAA,CAAA,CAAA,aAAO,QAAQ,CAAC,IAAI,CAAA;;;AAEpB,oBAAA,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,OAAK,CAAC;AACvC,oBAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC;;;;;AAE9D;AAED;;;;;;;;;;AAUG;SACmB,oBAAoB,CAAA,WAAA,EAAA,QAAA,EAAA,WAAA,EAAA,UAAA,EAAA,oBAAA,EAAA;wDACxC,SAAiB,EACjB,MAAc,EACd,SAAqC,EACrC,QAAoC,EACpC,kBAA0B,EAC1B,OAKM,EAAA;;;AALN,QAAA,IAAA,OAAA,KAAA,MAAA,EAAA,EAAA,OAAA,GAAA,EAKM,CAAA,CAAA;;;;oBAEN,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACvC,wBAAA,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC;oBACnD;AAEM,oBAAA,sBAAsB,GAAG,wBAAwB,CACrD,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAO,CAAC,YAAY,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,kBAAkB,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,SAAS,CACxD;oBACK,kBAAkB,GAAG,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAC9D,oBAAA,UAAU,GACd,OAAO,OAAO,CAAC,gBAAgB,KAAK;0BAChC,OAAO,CAAC;0BACR,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;AAE1C,oBAAA,aAAa,GAAG;0BAClB,EAAA,CAAA,MAAA,CAAG,sBAAsB,EAAA,QAAA;0BACzB,sBAAsB;AACpB,oBAAA,YAAY,GAAG,EAAA,CAAA,MAAA,CAAG,sBAAsB,EAAA,OAAA,CAAO;AAE/C,oBAAA,oBAAoB,GAAG,EAAA,CAAA,MAAA,CAAG,aAAa,EAAA,MAAA,CAAM;oBAC7C,gBAAgB,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;AACtE,oBAAA,mBAAmB,GAAG,EAAA,CAAA,MAAA,CAAG,YAAY,EAAA,MAAA,CAAM;oBAC3C,eAAe,GAAG,QAAQ,CAAC;0BAC7B,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,mBAAmB;0BACjD,IAAI;AAEF,oBAAA,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAE/B,oBAAA,QAAQ,CAAC,MAAM,CACb,YAAY,EACZ,SAAS,CAAC,KAAK,CAAC,KAAK,EACrB,0BAA0B,CAC3B;AACD,oBAAA,IAAI,SAAS,CAAC,KAAK,EAAE;AACnB,wBAAA,QAAQ,CAAC,MAAM,CACb,WAAW,EACX,SAAS,CAAC,KAAK,CAAC,KAAK,EACrB,0BAA0B,CAC3B;oBACH;oBAEA,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,CAAC;oBACvE,IAAI,eAAe,EAAE;wBACnB,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,eAAe,EAAE,mBAAmB,CAAC;oBACtE;oBAEM,SAAS,GAA2B,EAAE;AAC5C,oBAAA,SAAS,CAAC,oBAAoB,CAAC,GAAG;0BAC9B,EAAA,CAAA,MAAA,CAAG,kBAAkB,EAAA,QAAA;0BACrB,kBAAkB;oBACtB,IAAI,eAAe,EAAE;AACnB,wBAAA,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAA,CAAA,MAAA,CAAG,kBAAkB,UAAO;oBAC/D;AAEA,oBAAA,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACvD,oBAAA,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC;AACvC,oBAAA,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;AACjC,oBAAA,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;oBACzD,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;oBAC3D,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;AACvD,oBAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;AAEvB,oBAAA,EAAA,GAA8C,OAAO,CAAA,aAAjC,EAApB,aAAa,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,GAAA,EAAA,EAAE,EAAA,GAAwB,OAAO,eAAZ,EAAnB,cAAc,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,KAAA;;;;AAG/C,oBAAA,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC;AAChD,oBAAA,OAAA,CAAA,CAAA,YAAM,UAAU,CAAC,IAAI,CACpC,eAAA,CAAA,MAAA,CAAgB,SAAS,EAAA,iBAAA,CAAiB,EAC1C,QAAQ,EACR,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAC9B,CAAA;;AAJK,oBAAA,QAAQ,GAAG,EAAA,CAAA,IAAA,EAIhB;AAEG,oBAAA,IAAA,CAAA,aAAa,EAAb,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;;;;AAEM,oBAAA,UAAU,GAAA,QAAA,CAAA,QAAA,CAAA,EAAA,EACX,cAAc,CAAA,EAAA,EACjB,YAAY,EAAE;AACZ,4BAAA,SAAS,EAAA,SAAA;AACT,4BAAA,MAAM,EAAE,YAAY;AACpB,4BAAA,QAAQ,EAAE,EAAE;AACZ,4BAAA,WAAW,EAAE,YAAY;AACzB,4BAAA,OAAO,EAAE,+BAA+B;AACxC,4BAAA,UAAU,EAAE,IAAI;AAChB,4BAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,4BAAA,WAAW,EAAE,IAAI;AACjB,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA,EAAA,CACF;AACqB,oBAAA,OAAA,CAAA,CAAA,YAAM,kBAAkB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;;AAA/D,oBAAA,aAAa,GAAG,EAAA,CAAA,IAAA,EAA+C;AACrE,oBAAA,OAAA,CAAA,CAAA,aAAO,aAAa,CAAA;;;AAEpB,oBAAA,OAAO,CAAC,IAAI,CACV,4DAA4D,EAC5D,WAAS,CACV;;;oBAIL,IAAI,CAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,MAAI,CAAA,EAAA,GAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,CAAA,EAAE;AAChD,wBAAA,OAAA,CAAA,CAAA,aAAO,MAAA,QAAQ,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,QAAQ,CAAA;oBAClC;AAEM,oBAAA,YAAY,GAAG,CAAA,CAAA,EAAA,GAAA,QAAQ,aAAR,QAAQ,KAAA,MAAA,GAAA,MAAA,GAAR,QAAQ,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,KAAI,eAAe;AAC/D,oBAAA,MAAM,IAAI,KAAK,CAAC,0CAAmC,YAAY,CAAE,CAAC;;;AAElE,oBAAA,WAAW,EAAE;oBACb,IAAI,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAK,CAAC,QAAQ,0CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,EAAE;AACjC,wBAAA,MAAM,IAAI,KAAK,CAAC,mBAAA,CAAA,MAAA,CAAoB,OAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAE,CAAC;oBACpE;AACA,oBAAA,IAAI,OAAK,CAAC,OAAO,EAAE;AACjB,wBAAA,MAAM,OAAK;oBACb;AACA,oBAAA,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D;;;;;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"analysis.js","sources":["../../../../src/services/analysis.ts"],"sourcesContent":["import type { onUploadFiles } from \"../types/uploadFiles\";\nimport { dataURLtoFile, getMimeTypeFromDataURL } from \"./utils\";\nimport { mimeTypeToExtension } from \"../utils/mimeTypes\";\nimport { apiService } from \"./api\";\nimport type { SelfieCaptureData } from \"../types/selfie\";\nimport type {\n DocumentVideoCaptureBySide,\n DocumentVideoPreviewBySide,\n} from \"../types/documentVideo\";\nimport { getSessionMemoryUserInput } from \"./sessionMemoryStore\";\nimport {\n logDocumentUploaded,\n logSelfieCaptured,\n logAiControlled,\n logStatusModified,\n} from \"./auditTrailService\";\nimport { pollAnalysisStatus, stopPolling } from \"./pollingService\";\nimport type { PollingOptions } from \"./pollingService\";\n\n// Timeout configurations (in milliseconds)\nconst ANALYSIS_TIMEOUT = 600000; // 10 minutes for document analysis (increased for large files + ML processing)\nconst SELFIE_ANALYSIS_TIMEOUT = 600000; // 10 minutes for selfie analysis\nconst UPLOAD_TIMEOUT = 300000; // 5 minutes for file uploads\n\n// Map pour suivre les analyses en cours et éviter les doublons\nconst ongoingAnalyses = new Map<string, Promise<any>>();\n\nexport interface AnalyzeFilesOptions {\n personPhoto?: string | null;\n save?: boolean;\n incrementAnalysis?: boolean;\n forceUpload?: boolean;\n documentTypeKey?: string | null;\n requiresTwoSides?: boolean;\n enablePolling?: boolean; // Enable polling for analysis progress (default: true)\n pollingOptions?: PollingOptions; // Custom polling configuration\n collectOnly?: boolean; // Bypass AI verification — document is collected as-is\n}\n\ninterface LaunchAnalysisOptions extends AnalyzeFilesOptions {}\n\nfunction createFileName(fileURL: string, baseName: string = \"file\") {\n const mimeType = getMimeTypeFromDataURL(fileURL);\n if (!mimeType) {\n throw new Error(\"Unable to determine MIME type from file URL\");\n }\n\n const ext = mimeTypeToExtension(mimeType);\n const safeBase = baseName.replace(/\\.+$/, \"\");\n return ext ? `${safeBase}.${ext}` : safeBase;\n}\n\nfunction normalizeDocumentTypeKey(\n rawType?: string | null,\n fallback: string = \"document\",\n) {\n if (!rawType) {\n return fallback;\n }\n\n const trimmed = rawType.trim();\n if (!trimmed) {\n return fallback;\n }\n\n const withUnderscores = trimmed\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[\\s-]+/g, \"_\")\n .replace(/[^a-zA-Z0-9_]/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toLowerCase();\n\n return withUnderscores || fallback;\n}\n\n// Fonction pour créer une clé unique pour identifier une analyse\nfunction createAnalysisKey(\n sessionId: string,\n files: onUploadFiles,\n documentTypeId: string,\n): string {\n const frontHash = files.front ? files.front.substring(0, 50) : \"no-front\";\n const backHash = files.back ? files.back.substring(0, 50) : \"no-back\";\n return `${sessionId}-${documentTypeId}-${frontHash}-${backHash}`;\n}\n\nasync function launchAnalysis(\n sessionId: string,\n nodeId: string,\n files: onUploadFiles,\n documentTypeId: string | null,\n options: LaunchAnalysisOptions = {},\n) {\n if (!sessionId || !files) {\n throw new Error(\"Invalid parameters for analysis\");\n }\n\n const {\n personPhoto = null,\n save = true,\n incrementAnalysis = true,\n forceUpload = false,\n documentTypeKey = null,\n requiresTwoSides,\n collectOnly = false,\n } = options;\n\n const formData = new FormData();\n formData.append(\"sessionId\", sessionId);\n formData.append(\"nodeId\", nodeId);\n formData.append(\"save\", String(save));\n\n const userInput = getSessionMemoryUserInput(sessionId);\n if (Object.keys(userInput).length > 0) {\n const fullName = `${userInput.firstName || \"\"} ${\n userInput.lastName || \"\"\n }`.trim();\n formData.append(\"name\", fullName || \"Unknown\");\n\n formData.append(\"firstName\", userInput.firstName || \"\");\n formData.append(\"lastName\", userInput.lastName || \"\");\n formData.append(\"birthDate\", userInput.birthDate || \"\");\n formData.append(\"countryCode\", userInput.countryCode || \"\");\n }\n\n const fileTypes: Record<string, string> = {};\n const normalizedDocumentType = normalizeDocumentTypeKey(\n documentTypeKey ?? documentTypeId ?? undefined,\n );\n const hyphenDocumentType = normalizedDocumentType.replace(/_/g, \"-\");\n const appendSide =\n typeof requiresTwoSides === \"boolean\"\n ? requiresTwoSides\n : Boolean(files.back);\n\n if (files.front) {\n const frontBaseName = appendSide\n ? `${normalizedDocumentType}_front`\n : normalizedDocumentType;\n const frontFileName = createFileName(files.front, frontBaseName);\n const frontFile = dataURLtoFile(files.front, frontFileName);\n formData.append(\"files\", frontFile, frontFileName);\n\n fileTypes[frontFileName] = appendSide\n ? `${hyphenDocumentType}-front`\n : hyphenDocumentType;\n }\n\n if (files.back) {\n const backBaseName = `${normalizedDocumentType}_back`;\n const backFileName = createFileName(files.back, backBaseName);\n const backFile = dataURLtoFile(files.back, backFileName);\n formData.append(\"files\", backFile, backFileName);\n\n fileTypes[backFileName] = `${hyphenDocumentType}-back`;\n }\n\n formData.append(\"fileTypes\", JSON.stringify(fileTypes));\n formData.append(\"incrementAnalysis\", String(incrementAnalysis));\n formData.append(\"forceUpload\", String(forceUpload));\n\n if (documentTypeId) {\n formData.append(\"documentTemplateId\", documentTypeId);\n }\n\n if (personPhoto) {\n formData.append(\"personPhoto\", personPhoto);\n }\n\n if (collectOnly) {\n formData.append(\"collectOnly\", \"true\");\n }\n\n console.debug(\"FormData prepared for analysis:\", {\n sessionId,\n documentTypeId,\n files: Object.keys(fileTypes),\n save,\n incrementAnalysis,\n forceUpload,\n collectOnly,\n });\n return formData;\n}\n\nexport async function analyzeFiles(\n sessionId: string,\n nodeId: string,\n files: onUploadFiles,\n documentTypeId: string,\n options: AnalyzeFilesOptions = {},\n): Promise<any> {\n // Validate required parameters\n if (!sessionId) {\n throw new Error(\"Missing sessionId: A valid session ID is required.\");\n }\n if (!files || Object.keys(files).length === 0) {\n throw new Error(\n \"Missing files: At least one file must be provided for analysis.\",\n );\n }\n\n const {\n personPhoto = null,\n save = true,\n incrementAnalysis = true,\n forceUpload = false,\n documentTypeKey = null,\n requiresTwoSides,\n enablePolling = true,\n pollingOptions = {},\n collectOnly = false,\n } = options;\n\n // Pour les retry, on ne force pas l'upload mais on écrase l'analyse existante\n const isRetry = !incrementAnalysis && !forceUpload;\n\n // Créer une clé unique pour cette analyse\n const analysisKey = createAnalysisKey(sessionId, files, documentTypeId);\n\n // Vérifier si une analyse identique est déjà en cours\n if (ongoingAnalyses.has(analysisKey) && !isRetry) {\n return ongoingAnalyses.get(analysisKey);\n }\n\n // Helper function for retry logic with exponential backoff\n async function submitAnalysisWithRetry(\n formData: FormData,\n maxAttempts: number = 3,\n ) {\n let lastError: any;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const rawClient = apiService.getRawClient();\n\n const response = await rawClient.post(\n `/session/sdk/${sessionId}/analysis`,\n formData,\n {\n timeout: ANALYSIS_TIMEOUT,\n },\n );\n\n return response;\n } catch (error: any) {\n lastError = error;\n\n // Check if it's a network error (likely backend didn't respond in time)\n if (\n error.code === \"ERR_NETWORK\" ||\n error.message?.includes(\"CORS request did not succeed\")\n ) {\n console.warn(\n `⚠️ Network error on attempt ${attempt}: ${error.message}`,\n );\n\n if (attempt < maxAttempts) {\n // Exponential backoff: wait 2s, 4s, 8s...\n const waitTime = Math.pow(2, attempt) * 1000;\n console.log(`⏳ Retrying in ${waitTime / 1000}s...`);\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n continue;\n }\n }\n\n // For other errors, don't retry\n throw error;\n }\n }\n\n throw lastError;\n }\n\n // Créer la promesse d'analyse et la stocker\n const analysisPromise = (async () => {\n try {\n const formData = await launchAnalysis(\n sessionId,\n nodeId,\n files,\n documentTypeId,\n {\n personPhoto,\n save,\n incrementAnalysis: isRetry ? false : incrementAnalysis,\n forceUpload: isRetry ? true : forceUpload,\n documentTypeKey,\n requiresTwoSides,\n collectOnly,\n },\n );\n\n await logDocumentUploaded(sessionId, {\n documentTypeId: documentTypeId || \"unknown\",\n ...(documentTypeKey ? { documentTypeKey } : {}),\n hasFrontImage: !!files.front,\n hasBackImage: !!files.back,\n });\n\n // Submit with automatic retry on network errors\n const response = await submitAnalysisWithRetry(formData);\n\n // Wrap response to match ApiResponse type\n const wrappedResponse = {\n data: response.data,\n success: true,\n status: response.status,\n };\n\n await logAiControlled(\n sessionId,\n {\n analysisResult: response.data.status || \"unknown\",\n documentTypeId: documentTypeId || \"unknown\",\n },\n response.data.clientInfoId || undefined,\n );\n\n if (!wrappedResponse.success) {\n throw new Error(`Analysis failed: ${response.data}`);\n }\n\n // Start polling for analysis progress if enabled\n if (enablePolling) {\n try {\n const pollConfig: PollingOptions = {\n ...pollingOptions,\n };\n\n const pollingResult = await pollAnalysisStatus(sessionId, pollConfig);\n\n return pollingResult;\n } catch (pollError) {\n console.warn(\n \"⚠️ Polling error (analysis may still be processing):\",\n pollError,\n );\n // Don't throw - polling error shouldn't fail the analysis submission\n // The backend is still processing even if polling fails\n return response.data;\n }\n }\n\n return response.data;\n } catch (error) {\n console.error(\"❌ Analysis failed:\", error);\n // Stop any ongoing polling on error\n stopPolling();\n throw error;\n } finally {\n // Nettoyer la promesse de la map une fois terminée\n ongoingAnalyses.delete(analysisKey);\n }\n })();\n\n // Stocker la promesse pour éviter les appels simultanés\n ongoingAnalyses.set(analysisKey, analysisPromise);\n\n return analysisPromise;\n}\n\nexport async function analyzeSelfie(\n sessionId: string,\n selfieFile: SelfieCaptureData,\n selfiePhoto: string,\n): Promise<any> {\n console.log(\"🤳 Starting selfie analysis for session:\", sessionId);\n console.log(\"� File size:\", selfieFile.media.size, \"bytes\");\n\n const formData = new FormData();\n formData.append(\"file\", selfieFile.media, \"selfie.mp4\");\n formData.append(\"photo\", selfiePhoto);\n\n try {\n console.log(\"🚀 Sending selfie to UNISSEY API...\");\n\n const response = await apiService.post(\n `/session/unissey/${sessionId}/analyze`,\n formData,\n {\n timeout: SELFIE_ANALYSIS_TIMEOUT,\n },\n );\n\n console.log(\"✅ Analysis response:\", response);\n\n // Si la réponse API indique un succès, traiter la réponse Unissey\n if (response.success && response.data) {\n console.log(\"🎉 Unissey analysis completed - checking results...\");\n\n // response.data contient directement la réponse Unissey avec status, message, data\n const unisseyResponse = response.data;\n\n // Vérifier si Unissey a répondu avec succès\n if (\n unisseyResponse.status === 200 &&\n (unisseyResponse.message === \"success\" ||\n unisseyResponse.message === \"ok\")\n ) {\n console.log(\"✅ Unissey returned success status\");\n\n // Utiliser les données réelles de la réponse Unissey\n const unisseyData = unisseyResponse.data;\n\n // Vérifier si la comparaison faciale a un niveau de confiance élevé\n const faceComparison = unisseyData.details?.face_comparison;\n const isHighConfidence = faceComparison?.confidence_level === \"high\";\n const isMatch =\n unisseyData.is_match && faceComparison?.result === \"match\";\n\n // is_genuine est basé sur la confiance élevée de la comparaison faciale\n const isGenuine = isHighConfidence && isMatch;\n\n // Log selfie captured in audit trail\n try {\n const analysisResponse = await apiService.get(\n `/session/sdk/${sessionId}`,\n );\n if (analysisResponse.data && analysisResponse.data.analysisId) {\n await logSelfieCaptured(\n sessionId,\n analysisResponse.data.clientInfoId || undefined,\n );\n\n // Log AI control with selfie analysis results\n await logAiControlled(\n sessionId,\n {\n selfieAnalysisResult: isGenuine ? \"genuine\" : \"not_genuine\",\n isMatch: isMatch ? \"match\" : \"no_match\",\n confidenceLevel: faceComparison?.confidence_level || \"unknown\",\n },\n analysisResponse.data.clientInfoId || undefined,\n );\n\n await logStatusModified(\n sessionId,\n {\n selfieAnalysisResult: isGenuine ? \"genuine\" : \"not_genuine\",\n isMatch: isMatch ? \"match\" : \"no_match\",\n confidenceLevel: faceComparison?.confidence_level || \"unknown\",\n },\n analysisResponse.data.clientInfoId || undefined,\n );\n }\n } catch (err) {\n console.error(\"Failed to log selfie capture in audit trail:\", err);\n // Non-blocking error - continue analysis\n }\n\n // Retourner la structure attendue par l'UI\n return {\n success: true,\n data: {\n ...unisseyData,\n is_genuine: isGenuine, // Basé sur confidence_level === \"high\"\n },\n };\n } else {\n console.error(\n \"❌ Unissey returned error status:\",\n unisseyResponse.status,\n unisseyResponse.message,\n );\n throw new Error(\n `Unissey analysis failed: ${\n unisseyResponse.message || \"Unknown Unissey error\"\n }`,\n );\n }\n }\n\n // Gestion des erreurs spécifiques API\n const errorMessage =\n response.data?.message || response.data || \"Unknown error\";\n console.error(\"❌ API call failed:\", errorMessage);\n throw new Error(`Face comparison analysis failed: ${errorMessage}`);\n } catch (error: any) {\n console.error(\"💥 Analysis error:\", error);\n\n // Améliorer le message d'erreur pour l'UI\n if (error.response?.data?.message) {\n throw new Error(`Analysis failed: ${error.response.data.message}`);\n } else if (error.message) {\n throw error; // Garder le message d'erreur original si déjà formaté\n } else {\n throw new Error(\n \"Face comparison analysis failed due to an unexpected error\",\n );\n }\n }\n}\n\nexport async function uploadConvertedIdCardImage(\n sessionId: string,\n file: File,\n): Promise<any> {\n if (!sessionId || !file) {\n throw new Error(\"Invalid parameters for uploading converted ID card image\");\n }\n\n // rename file to converted_id_card.png\n const renamedFile = new File([file], \"converted_id_card.png\", {\n type: file.type,\n });\n\n const formData = new FormData();\n formData.append(\"file\", renamedFile, renamedFile.name);\n\n try {\n console.log(\n `🚀 Uploading converted ID card image for session: ${sessionId}`,\n );\n const response = await apiService.post(\n `/session/sdk/${sessionId}/converted_id_card.png`,\n formData,\n {\n timeout: UPLOAD_TIMEOUT,\n },\n );\n console.log(\"✅ Upload response:\", response);\n return response.data;\n } catch (error) {\n console.error(\"❌ Upload error:\", error);\n throw new Error(\"Failed to upload converted ID card image\");\n }\n}\n\n/**\n * Analyzes a document video captured with Unissey DOC_VIDEO preset.\n * Sends the video file and thumbnail to the backend for document verification.\n *\n * @param sessionId - Unique identifier for the current session\n * @param nodeId - Identifier for the current node in the journey\n * @param videoData - Document video capture data containing media blob and metadata\n * @param thumbnail - Base64 thumbnail extracted from the video\n * @param documentTemplateId - Template ID for the document type being verified\n * @returns Analysis response from the backend\n */\nexport async function analyzeDocumentVideo(\n sessionId: string,\n nodeId: string,\n videoData: DocumentVideoCaptureBySide,\n previews: DocumentVideoPreviewBySide,\n documentTemplateId: string,\n options: {\n documentType?: string;\n requiresTwoSides?: boolean;\n enablePolling?: boolean;\n pollingOptions?: PollingOptions;\n } = {},\n): Promise<any> {\n if (!videoData.recto || !previews.recto) {\n throw new Error(\"Missing recto video or preview\");\n }\n\n const normalizedDocumentType = normalizeDocumentTypeKey(\n options.documentType ?? documentTemplateId ?? undefined,\n );\n const hyphenDocumentType = normalizedDocumentType.replace(/_/g, \"-\");\n const appendSide =\n typeof options.requiresTwoSides === \"boolean\"\n ? options.requiresTwoSides\n : Boolean(videoData.verso || previews.verso);\n\n const frontBaseName = appendSide\n ? `${normalizedDocumentType}_front`\n : normalizedDocumentType;\n const backBaseName = `${normalizedDocumentType}_back`;\n\n const previewFrontFileName = `${frontBaseName}.jpg`;\n const previewFrontFile = dataURLtoFile(previews.recto, previewFrontFileName);\n const previewBackFileName = `${backBaseName}.jpg`;\n const previewBackFile = previews.verso\n ? dataURLtoFile(previews.verso, previewBackFileName)\n : null;\n\n const formData = new FormData();\n\n formData.append(\n \"videoFront\",\n videoData.recto.media,\n \"document_video_recto.mp4\",\n );\n if (videoData.verso) {\n formData.append(\n \"videoBack\",\n videoData.verso.media,\n \"document_video_verso.mp4\",\n );\n }\n\n formData.append(\"previewFront\", previewFrontFile, previewFrontFileName);\n if (previewBackFile) {\n formData.append(\"previewBack\", previewBackFile, previewBackFileName);\n }\n\n const fileTypes: Record<string, string> = {};\n fileTypes[previewFrontFileName] = appendSide\n ? `${hyphenDocumentType}-front`\n : hyphenDocumentType;\n if (previewBackFile) {\n fileTypes[previewBackFileName] = `${hyphenDocumentType}-back`;\n }\n\n formData.append(\"fileTypes\", JSON.stringify(fileTypes));\n formData.append(\"sessionId\", sessionId);\n formData.append(\"nodeId\", nodeId);\n formData.append(\"documentTemplateId\", documentTemplateId);\n formData.append(\"documentType\", options.documentType || \"\");\n formData.append(\"requiresTwoSides\", String(appendSide));\n formData.append(\"save\", \"true\");\n\n const { enablePolling = true, pollingOptions = {} } = options;\n\n try {\n console.log(\"🚀 Sending document video to document-video API...\");\n const response = await apiService.post(\n `/session/sdk/${sessionId}/document-video`,\n formData,\n { timeout: ANALYSIS_TIMEOUT },\n );\n\n if (enablePolling) {\n try {\n const pollConfig: PollingOptions = {\n ...pollingOptions,\n defaultValue: {\n sessionId,\n status: \"processing\",\n progress: 50,\n currentStep: \"processing\",\n message: \"Document analysis in progress\",\n analysisId: null,\n startedAt: new Date().toISOString(),\n completedAt: null,\n error: null,\n },\n };\n const pollingResult = await pollAnalysisStatus(sessionId, pollConfig);\n return pollingResult;\n } catch (pollError) {\n console.warn(\n \"⚠️ Polling error (document-video may still be processing):\",\n pollError,\n );\n }\n }\n\n if (response?.success || response?.data?.success) {\n return response.data ?? response;\n }\n\n const errorMessage = response?.data?.message || \"Unknown error\";\n throw new Error(`Document video analysis failed: ${errorMessage}`);\n } catch (error: any) {\n stopPolling();\n if (error.response?.data?.message) {\n throw new Error(`Analysis failed: ${error.response.data.message}`);\n }\n if (error.message) {\n throw error;\n }\n throw new Error(\n \"Document video analysis failed due to an unexpected error\",\n );\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -18,11 +18,20 @@ var AuditTrailEventType;
|
|
|
18
18
|
AuditTrailEventType["AI_CONTROLED"] = "AI_CONTROLED";
|
|
19
19
|
AuditTrailEventType["SESSION_STARTED"] = "SESSION_STARTED";
|
|
20
20
|
AuditTrailEventType["SESSION_ENDED"] = "SESSION_ENDED";
|
|
21
|
+
AuditTrailEventType["SESSION_ABANDONED"] = "SESSION_ABANDONED";
|
|
21
22
|
AuditTrailEventType["DOCUMENT_UPLOADED"] = "DOCUMENT_UPLOADED";
|
|
22
23
|
AuditTrailEventType["SELFIE_CAPTURED"] = "SELFIE_CAPTURED";
|
|
23
24
|
AuditTrailEventType["FORM_SENDED_LINK"] = "FORM_SENDED_LINK";
|
|
24
25
|
AuditTrailEventType["SIGNATURE_DOCUMENT_OPENED"] = "SIGNATURE_DOCUMENT_OPENED";
|
|
25
26
|
AuditTrailEventType["DOCUMENT_SIGNED"] = "DOCUMENT_SIGNED";
|
|
27
|
+
AuditTrailEventType["FORM_VALIDATED"] = "FORM_VALIDATED";
|
|
28
|
+
AuditTrailEventType["DOCUMENT_TYPE_SELECTED"] = "DOCUMENT_TYPE_SELECTED";
|
|
29
|
+
AuditTrailEventType["CAPTURE_MODE_SELECTED"] = "CAPTURE_MODE_SELECTED";
|
|
30
|
+
AuditTrailEventType["PHOTO_CAPTURED"] = "PHOTO_CAPTURED";
|
|
31
|
+
AuditTrailEventType["PHOTOS_VALIDATED"] = "PHOTOS_VALIDATED";
|
|
32
|
+
AuditTrailEventType["DOCUMENT_LOADED"] = "DOCUMENT_LOADED";
|
|
33
|
+
AuditTrailEventType["DOCUMENTS_VALIDATED"] = "DOCUMENTS_VALIDATED";
|
|
34
|
+
AuditTrailEventType["VERIFICATION_COMPLETED"] = "VERIFICATION_COMPLETED";
|
|
26
35
|
})(AuditTrailEventType || (AuditTrailEventType = {}));
|
|
27
36
|
/**
|
|
28
37
|
* Creates an audit trail entry and associates it with an analysis
|
|
@@ -186,6 +195,63 @@ var logDocumentSigned = function (analysisId, signatureInfo, clientInfoId) { ret
|
|
|
186
195
|
})];
|
|
187
196
|
});
|
|
188
197
|
}); };
|
|
198
|
+
// ─── APP3-1763 — Nouveaux events de parcours ─────────────────────────────────
|
|
199
|
+
// Convention : sessionId est passé dans le champ analysisId (backend route via toSession:true).
|
|
200
|
+
// Tous les appels sont fire-and-forget — les callers ne doivent PAS await ces fonctions.
|
|
201
|
+
var logFormValidated = function (sessionId, userInputs, clientInfoId) {
|
|
202
|
+
createAuditTrailEntry({
|
|
203
|
+
eventType: AuditTrailEventType.FORM_VALIDATED,
|
|
204
|
+
analysisId: sessionId,
|
|
205
|
+
userInputs: {},
|
|
206
|
+
clientInfoId: clientInfoId,
|
|
207
|
+
}).catch(function () { });
|
|
208
|
+
};
|
|
209
|
+
var logDocumentTypeSelected = function (sessionId, documentType, documentLabel, clientInfoId) {
|
|
210
|
+
createAuditTrailEntry({
|
|
211
|
+
eventType: AuditTrailEventType.DOCUMENT_TYPE_SELECTED,
|
|
212
|
+
analysisId: sessionId,
|
|
213
|
+
metadata: { documentType: documentType, documentLabel: documentLabel !== null && documentLabel !== void 0 ? documentLabel : documentType },
|
|
214
|
+
clientInfoId: clientInfoId,
|
|
215
|
+
}).catch(function () { });
|
|
216
|
+
};
|
|
217
|
+
var logCaptureModeSelected = function (sessionId, captureMode, clientInfoId) {
|
|
218
|
+
createAuditTrailEntry({
|
|
219
|
+
eventType: AuditTrailEventType.CAPTURE_MODE_SELECTED,
|
|
220
|
+
analysisId: sessionId,
|
|
221
|
+
metadata: { captureMode: captureMode },
|
|
222
|
+
clientInfoId: clientInfoId,
|
|
223
|
+
}).catch(function () { });
|
|
224
|
+
};
|
|
225
|
+
var logPhotoCaptured = function (sessionId, side, clientInfoId) {
|
|
226
|
+
createAuditTrailEntry({
|
|
227
|
+
eventType: AuditTrailEventType.PHOTO_CAPTURED,
|
|
228
|
+
analysisId: sessionId,
|
|
229
|
+
metadata: { side: side },
|
|
230
|
+
clientInfoId: clientInfoId,
|
|
231
|
+
}).catch(function () { });
|
|
232
|
+
};
|
|
233
|
+
var logPhotosValidated = function (sessionId, clientInfoId) {
|
|
234
|
+
createAuditTrailEntry({
|
|
235
|
+
eventType: AuditTrailEventType.PHOTOS_VALIDATED,
|
|
236
|
+
analysisId: sessionId,
|
|
237
|
+
clientInfoId: clientInfoId,
|
|
238
|
+
}).catch(function () { });
|
|
239
|
+
};
|
|
240
|
+
var logDocumentLoaded = function (sessionId, side, documentType, clientInfoId) {
|
|
241
|
+
createAuditTrailEntry({
|
|
242
|
+
eventType: AuditTrailEventType.DOCUMENT_LOADED,
|
|
243
|
+
analysisId: sessionId,
|
|
244
|
+
metadata: __assign({ side: side }, ({})),
|
|
245
|
+
clientInfoId: clientInfoId,
|
|
246
|
+
}).catch(function () { });
|
|
247
|
+
};
|
|
248
|
+
var logDocumentsValidated = function (sessionId, clientInfoId) {
|
|
249
|
+
createAuditTrailEntry({
|
|
250
|
+
eventType: AuditTrailEventType.DOCUMENTS_VALIDATED,
|
|
251
|
+
analysisId: sessionId,
|
|
252
|
+
clientInfoId: clientInfoId,
|
|
253
|
+
}).catch(function () { });
|
|
254
|
+
};
|
|
189
255
|
|
|
190
|
-
export { AuditTrailEventType, createAuditTrailEntry, logAiControlled, logDocumentSigned, logDocumentUploaded, logSelfieCaptured, logSessionEnded, logSessionStarted, logSignatureDocumentOpened, logStatusModified };
|
|
256
|
+
export { AuditTrailEventType, createAuditTrailEntry, logAiControlled, logCaptureModeSelected, logDocumentLoaded, logDocumentSigned, logDocumentTypeSelected, logDocumentUploaded, logDocumentsValidated, logFormValidated, logPhotoCaptured, logPhotosValidated, logSelfieCaptured, logSessionEnded, logSessionStarted, logSignatureDocumentOpened, logStatusModified };
|
|
191
257
|
//# sourceMappingURL=auditTrailService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auditTrailService.js","sources":["../../../../src/services/auditTrailService.ts"],"sourcesContent":["/**\n * Audit Trail Service\n *\n * Service for interacting with the Datakeen Audit Trail API.\n * Handles creating and retrieving audit trail entries.\n */\n\nimport { apiService } from \"./api\";\nimport { fetchSessionById } from \"./sessionService\";\n\n/**\n * Event types for audit trail entries.\n * These must match the backend AuditTrailEventType enum.\n */\nexport enum AuditTrailEventType {\n STATUS_MODIFIED = \"STATUS_MODIFIED\",\n INFORMATION_MODIFIED = \"INFORMATION_MODIFIED\",\n AI_CONTROLED = \"AI_CONTROLED\",\n SESSION_STARTED = \"SESSION_STARTED\",\n SESSION_ENDED = \"SESSION_ENDED\",\n DOCUMENT_UPLOADED = \"DOCUMENT_UPLOADED\",\n SELFIE_CAPTURED = \"SELFIE_CAPTURED\",\n FORM_SENDED_LINK = \"FORM_SENDED_LINK\",\n SIGNATURE_DOCUMENT_OPENED = \"SIGNATURE_DOCUMENT_OPENED\",\n DOCUMENT_SIGNED = \"DOCUMENT_SIGNED\",\n}\n\n/**\n * Interface for audit trail entry creation request data\n */\nexport interface CreateAuditTrailRequest {\n eventType: AuditTrailEventType;\n analysisId: string;\n documentsName?: Record<string, any>;\n userInputs?: Record<string, any>;\n clientInfoId?: string;\n userId?: string;\n}\n\n/**\n * Interface for audit trail entry response data\n */\nexport interface AuditTrailEntry {\n id: string;\n eventType: AuditTrailEventType;\n documentsName?: Record<string, any>;\n userInputs?: Record<string, any>;\n analysisId: string;\n clientInfoId?: string;\n userId?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Creates an audit trail entry and associates it with an analysis\n *\n * @param auditTrailData - The audit trail data to create\n * @returns The created audit trail entry\n */\nexport const createAuditTrailEntry = async (\n auditTrailData: CreateAuditTrailRequest\n): Promise<AuditTrailEntry> => {\n try {\n const payload = {\n ...auditTrailData,\n toSession: true,\n };\n const response = await apiService.post(\n \"/session/audit-trail\",\n payload\n );\n return response.data;\n } catch (error) {\n throw error;\n }\n};\n\n/**\n * Fetches all audit trail entries for a specific analysis\n *\n * @param analysisId - The ID of the analysis\n * @returns Array of audit trail entries\n */\nexport const getAuditTrailsByAnalysisId = async (\n analysisId: string\n): Promise<AuditTrailEntry[]> => {\n try {\n const response = await apiService.get(\n `/session/audit-trail/analysis/${analysisId}`\n );\n return response.data;\n } catch (error) {\n throw error;\n }\n};\n\n/**\n * Fetches all audit trail entries for a specific session\n *\n * @param sessionId - The ID of the session\n * @returns Array of audit trail entries\n */\nexport const getAuditTrailsBySessionId = async (\n sessionId: string\n): Promise<AuditTrailEntry[]> => {\n try {\n const response = await apiService.get(\n `/session/audit-trail/session/${sessionId}`\n );\n return response.data;\n } catch (error) {\n throw error;\n }\n};\n\n/**\n * Creates an audit trail entry when a session is started\n *\n * @param analysisId - The ID of the analysis associated with the session\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSessionStarted = async (\n analysisId: string,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SESSION_STARTED,\n analysisId,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a session is ended\n *\n * @param analysisId - The ID of the analysis associated with the session\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSessionEnded = async (\n analysisId: string,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SESSION_ENDED,\n analysisId,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a document is uploaded\n *\n * @param analysisId - The ID of the analysis\n * @param documentName - The name or details of the document\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logDocumentUploaded = async (\n analysisId: string,\n documentName: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENT_UPLOADED,\n analysisId,\n documentsName: documentName,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a selfie is captured\n *\n * @param analysisId - The ID of the analysis\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSelfieCaptured = async (\n analysisId: string,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SELFIE_CAPTURED,\n analysisId,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when user information is modified\n *\n * @param analysisId - The ID of the analysis\n * @param userInputs - The user inputs that were modified\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logInformationModified = async (\n analysisId: string,\n userInputs: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.INFORMATION_MODIFIED,\n analysisId,\n userInputs,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a session status is modified\n *\n * @param analysisId - The ID of the analysis\n * @param status - The new status value\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logStatusModified = async (\n analysisId: string,\n status: any,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.STATUS_MODIFIED,\n analysisId,\n userInputs: { status },\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when an AI control is performed\n *\n * @param analysisId - The ID of the analysis\n * @param aiResults - The results of the AI control\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logAiControlled = async (\n analysisId: string,\n aiResults: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.AI_CONTROLED,\n analysisId,\n userInputs: aiResults,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a form link is sent\n *\n * @param analysisId - The ID of the analysis\n * @param recipientInfo - Information about the link recipient\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logFormSendedLink = async (\n analysisId: string,\n recipientInfo: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.FORM_SENDED_LINK,\n analysisId,\n userInputs: recipientInfo,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a signature document is opened\n *\n * @param analysisId - The ID of the analysis\n * @param documentInfo - Information about the document being signed\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSignatureDocumentOpened = async (\n analysisId: string,\n documentInfo?: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SIGNATURE_DOCUMENT_OPENED,\n analysisId,\n userInputs: documentInfo || {},\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a document is signed\n *\n * @param analysisId - The ID of the analysis\n * @param signatureInfo - Information about the signature\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logDocumentSigned = async (\n analysisId: string,\n signatureInfo?: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENT_SIGNED,\n analysisId,\n userInputs: signatureInfo || {},\n clientInfoId,\n });\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auditTrailService.js","sources":["../../../../src/services/auditTrailService.ts"],"sourcesContent":["/**\n * Audit Trail Service\n *\n * Service for interacting with the Datakeen Audit Trail API.\n * Handles creating and retrieving audit trail entries.\n */\n\nimport { apiService } from \"./api\";\nimport { fetchSessionById } from \"./sessionService\";\n\n/**\n * Event types for audit trail entries.\n * These must match the backend AuditTrailEventType enum.\n */\nexport enum AuditTrailEventType {\n STATUS_MODIFIED = \"STATUS_MODIFIED\",\n INFORMATION_MODIFIED = \"INFORMATION_MODIFIED\",\n AI_CONTROLED = \"AI_CONTROLED\",\n SESSION_STARTED = \"SESSION_STARTED\",\n SESSION_ENDED = \"SESSION_ENDED\",\n SESSION_ABANDONED = \"SESSION_ABANDONED\",\n DOCUMENT_UPLOADED = \"DOCUMENT_UPLOADED\",\n SELFIE_CAPTURED = \"SELFIE_CAPTURED\",\n FORM_SENDED_LINK = \"FORM_SENDED_LINK\",\n SIGNATURE_DOCUMENT_OPENED = \"SIGNATURE_DOCUMENT_OPENED\",\n DOCUMENT_SIGNED = \"DOCUMENT_SIGNED\",\n FORM_VALIDATED = \"FORM_VALIDATED\",\n DOCUMENT_TYPE_SELECTED = \"DOCUMENT_TYPE_SELECTED\",\n CAPTURE_MODE_SELECTED = \"CAPTURE_MODE_SELECTED\",\n PHOTO_CAPTURED = \"PHOTO_CAPTURED\",\n PHOTOS_VALIDATED = \"PHOTOS_VALIDATED\",\n DOCUMENT_LOADED = \"DOCUMENT_LOADED\",\n DOCUMENTS_VALIDATED = \"DOCUMENTS_VALIDATED\",\n VERIFICATION_COMPLETED = \"VERIFICATION_COMPLETED\",\n}\n\n/**\n * Interface for audit trail entry creation request data\n */\nexport interface CreateAuditTrailRequest {\n eventType: AuditTrailEventType;\n analysisId: string;\n documentsName?: Record<string, any>;\n userInputs?: Record<string, any>;\n metadata?: Record<string, any>;\n clientInfoId?: string;\n userId?: string;\n}\n\n/**\n * Interface for audit trail entry response data\n */\nexport interface AuditTrailEntry {\n id: string;\n eventType: AuditTrailEventType;\n documentsName?: Record<string, any>;\n userInputs?: Record<string, any>;\n analysisId: string;\n clientInfoId?: string;\n userId?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Creates an audit trail entry and associates it with an analysis\n *\n * @param auditTrailData - The audit trail data to create\n * @returns The created audit trail entry\n */\nexport const createAuditTrailEntry = async (\n auditTrailData: CreateAuditTrailRequest\n): Promise<AuditTrailEntry> => {\n try {\n const payload = {\n ...auditTrailData,\n toSession: true,\n };\n const response = await apiService.post(\n \"/session/audit-trail\",\n payload\n );\n return response.data;\n } catch (error) {\n throw error;\n }\n};\n\n/**\n * Fetches all audit trail entries for a specific analysis\n *\n * @param analysisId - The ID of the analysis\n * @returns Array of audit trail entries\n */\nexport const getAuditTrailsByAnalysisId = async (\n analysisId: string\n): Promise<AuditTrailEntry[]> => {\n try {\n const response = await apiService.get(\n `/session/audit-trail/analysis/${analysisId}`\n );\n return response.data;\n } catch (error) {\n throw error;\n }\n};\n\n/**\n * Fetches all audit trail entries for a specific session\n *\n * @param sessionId - The ID of the session\n * @returns Array of audit trail entries\n */\nexport const getAuditTrailsBySessionId = async (\n sessionId: string\n): Promise<AuditTrailEntry[]> => {\n try {\n const response = await apiService.get(\n `/session/audit-trail/session/${sessionId}`\n );\n return response.data;\n } catch (error) {\n throw error;\n }\n};\n\n/**\n * Creates an audit trail entry when a session is started\n *\n * @param analysisId - The ID of the analysis associated with the session\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSessionStarted = async (\n analysisId: string,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SESSION_STARTED,\n analysisId,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a session is ended\n *\n * @param analysisId - The ID of the analysis associated with the session\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSessionEnded = async (\n analysisId: string,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SESSION_ENDED,\n analysisId,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a document is uploaded\n *\n * @param analysisId - The ID of the analysis\n * @param documentName - The name or details of the document\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logDocumentUploaded = async (\n analysisId: string,\n documentName: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENT_UPLOADED,\n analysisId,\n documentsName: documentName,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a selfie is captured\n *\n * @param analysisId - The ID of the analysis\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSelfieCaptured = async (\n analysisId: string,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SELFIE_CAPTURED,\n analysisId,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when user information is modified\n *\n * @param analysisId - The ID of the analysis\n * @param userInputs - The user inputs that were modified\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logInformationModified = async (\n analysisId: string,\n userInputs: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.INFORMATION_MODIFIED,\n analysisId,\n userInputs,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a session status is modified\n *\n * @param analysisId - The ID of the analysis\n * @param status - The new status value\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logStatusModified = async (\n analysisId: string,\n status: any,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.STATUS_MODIFIED,\n analysisId,\n userInputs: { status },\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when an AI control is performed\n *\n * @param analysisId - The ID of the analysis\n * @param aiResults - The results of the AI control\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logAiControlled = async (\n analysisId: string,\n aiResults: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.AI_CONTROLED,\n analysisId,\n userInputs: aiResults,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a form link is sent\n *\n * @param analysisId - The ID of the analysis\n * @param recipientInfo - Information about the link recipient\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logFormSendedLink = async (\n analysisId: string,\n recipientInfo: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.FORM_SENDED_LINK,\n analysisId,\n userInputs: recipientInfo,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a signature document is opened\n *\n * @param analysisId - The ID of the analysis\n * @param documentInfo - Information about the document being signed\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSignatureDocumentOpened = async (\n analysisId: string,\n documentInfo?: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SIGNATURE_DOCUMENT_OPENED,\n analysisId,\n userInputs: documentInfo || {},\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a document is signed\n *\n * @param analysisId - The ID of the analysis\n * @param signatureInfo - Information about the signature\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logDocumentSigned = async (\n analysisId: string,\n signatureInfo?: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENT_SIGNED,\n analysisId,\n userInputs: signatureInfo || {},\n clientInfoId,\n });\n};\n\n// ─── APP3-1763 — Nouveaux events de parcours ─────────────────────────────────\n// Convention : sessionId est passé dans le champ analysisId (backend route via toSession:true).\n// Tous les appels sont fire-and-forget — les callers ne doivent PAS await ces fonctions.\n\nexport const logFormValidated = (\n sessionId: string,\n userInputs?: Record<string, any>,\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.FORM_VALIDATED,\n analysisId: sessionId,\n userInputs: userInputs || {},\n clientInfoId,\n }).catch(() => {});\n};\n\nexport const logDocumentTypeSelected = (\n sessionId: string,\n documentType: string,\n documentLabel?: string,\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENT_TYPE_SELECTED,\n analysisId: sessionId,\n metadata: { documentType, documentLabel: documentLabel ?? documentType },\n clientInfoId,\n }).catch(() => {});\n};\n\nexport const logCaptureModeSelected = (\n sessionId: string,\n captureMode: \"picture\" | \"upload\",\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.CAPTURE_MODE_SELECTED,\n analysisId: sessionId,\n metadata: { captureMode },\n clientInfoId,\n }).catch(() => {});\n};\n\nexport const logPhotoCaptured = (\n sessionId: string,\n side: \"recto\" | \"verso\",\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.PHOTO_CAPTURED,\n analysisId: sessionId,\n metadata: { side },\n clientInfoId,\n }).catch(() => {});\n};\n\nexport const logPhotosValidated = (\n sessionId: string,\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.PHOTOS_VALIDATED,\n analysisId: sessionId,\n clientInfoId,\n }).catch(() => {});\n};\n\nexport const logDocumentLoaded = (\n sessionId: string,\n side: \"recto\" | \"verso\",\n documentType?: string,\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENT_LOADED,\n analysisId: sessionId,\n metadata: { side, ...(documentType ? { documentType } : {}) },\n clientInfoId,\n }).catch(() => {});\n};\n\nexport const logDocumentsValidated = (\n sessionId: string,\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENTS_VALIDATED,\n analysisId: sessionId,\n clientInfoId,\n }).catch(() => {});\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a human-readable label into a snake_case key suitable for top-level
|
|
3
|
+
* storage in userInput.
|
|
4
|
+
*
|
|
5
|
+
* Rules:
|
|
6
|
+
* - Strip diacritical marks (accents)
|
|
7
|
+
* - Lowercase everything
|
|
8
|
+
* - Replace any sequence of non-alphanumeric characters with a single underscore
|
|
9
|
+
* - Trim leading/trailing underscores
|
|
10
|
+
*
|
|
11
|
+
* Examples:
|
|
12
|
+
* "Dénomination sociale" → "denomination_sociale"
|
|
13
|
+
* "N° de SIREN / SIRET" → "n_de_siren_siret"
|
|
14
|
+
* " E-mail " → "e_mail"
|
|
15
|
+
*/
|
|
16
|
+
function labelToKey(label) {
|
|
17
|
+
return label
|
|
18
|
+
.normalize("NFD")
|
|
19
|
+
.replace(/[̀-ͯ]/g, "")
|
|
20
|
+
.toLowerCase()
|
|
21
|
+
.replace(/[^a-z0-9]+/g, "_")
|
|
22
|
+
.replace(/^_+|_+$/g, "");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { labelToKey };
|
|
26
|
+
//# sourceMappingURL=labelToKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labelToKey.js","sources":["../../../../src/utils/labelToKey.ts"],"sourcesContent":["/**\n * Converts a human-readable label into a snake_case key suitable for top-level\n * storage in userInput.\n *\n * Rules:\n * - Strip diacritical marks (accents)\n * - Lowercase everything\n * - Replace any sequence of non-alphanumeric characters with a single underscore\n * - Trim leading/trailing underscores\n *\n * Examples:\n * \"Dénomination sociale\" → \"denomination_sociale\"\n * \"N° de SIREN / SIRET\" → \"n_de_siren_siret\"\n * \" E-mail \" → \"e_mail\"\n */\nexport function labelToKey(label: string): string {\n return label\n .normalize(\"NFD\")\n .replace(/[̀-ͯ]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n}\n"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;AAcG;AACG,SAAU,UAAU,CAAC,KAAa,EAAA;AACtC,IAAA,OAAO;SACJ,SAAS,CAAC,KAAK;AACf,SAAA,OAAO,CAAC,QAAQ,EAAE,EAAE;AACpB,SAAA,WAAW;AACX,SAAA,OAAO,CAAC,aAAa,EAAE,GAAG;AAC1B,SAAA,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;AAC5B;;;;"}
|
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
|
|
6
6
|
import { configureApiBaseURL } from "client-sessions-react-sdk";
|
|
7
7
|
|
|
8
|
+
const PRODUCTION_API_URL: string =
|
|
9
|
+
process.env.VITE_API_URL ||
|
|
10
|
+
"https://app.datakeen.co/backend";
|
|
11
|
+
|
|
8
12
|
// =====================================
|
|
9
13
|
// Configuration par environnement
|
|
10
14
|
// =====================================
|
|
@@ -16,7 +20,7 @@ export const configureSDKForEnvironment = () => {
|
|
|
16
20
|
|
|
17
21
|
switch (environment) {
|
|
18
22
|
case "production":
|
|
19
|
-
apiBaseURL =
|
|
23
|
+
apiBaseURL = PRODUCTION_API_URL;
|
|
20
24
|
break;
|
|
21
25
|
|
|
22
26
|
case "staging":
|
|
@@ -64,9 +68,9 @@ export const configureSDKDynamically = () => {
|
|
|
64
68
|
|
|
65
69
|
let apiBaseURL: string;
|
|
66
70
|
|
|
67
|
-
if (hostname.includes("app.datakeen.co")) {
|
|
71
|
+
if (hostname.includes("app.datakeen.co") || hostname.includes("app-v3.datakeen.co")) {
|
|
68
72
|
// Production
|
|
69
|
-
apiBaseURL =
|
|
73
|
+
apiBaseURL = PRODUCTION_API_URL;
|
|
70
74
|
} else if (hostname.includes("app.staging.datakeen.co")) {
|
|
71
75
|
// Staging
|
|
72
76
|
apiBaseURL = "https://app.staging.datakeen.co/backend";
|
|
@@ -115,7 +119,7 @@ export const configureSDKAdvanced = (options: {
|
|
|
115
119
|
if (!apiBaseURL && environment) {
|
|
116
120
|
switch (environment) {
|
|
117
121
|
case "production":
|
|
118
|
-
apiBaseURL =
|
|
122
|
+
apiBaseURL = PRODUCTION_API_URL;
|
|
119
123
|
break;
|
|
120
124
|
case "staging":
|
|
121
125
|
apiBaseURL = "https://app.staging.datakeen.co/backend";
|