sunuid-sdk 1.0.58 → 1.0.60

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.
@@ -1 +1 @@
1
- {"version":3,"file":"sunuid-sdk.min.js","sources":["../src/sunuid-sdk.js"],"sourcesContent":["/**\n * SunuID SDK - Package d'intégration pour partenaires\n * \n * @version 1.0.0\n * @author SunuID Team\n * @license MIT\n */\n\n(function(window) {\n 'use strict';\n\n // Configuration par défaut\n const DEFAULT_CONFIG = {\n apiUrl: window.SunuIDConfig?.apiUrl || 'https://api.sunuid.fayma.sn',\n clientId: null,\n secretId: null,\n type: 2, // Type par défaut (2 = authentification)\n partnerName: null, // Nom du partenaire récupéré depuis l'API\n theme: 'light',\n language: 'fr',\n autoRefresh: false, // Désactivé par défaut pour éviter les appels répétitifs\n refreshInterval: 30000, // 30 secondes\n autoInit: false, // Désactivé par défaut pour éviter les boucles\n onSuccess: null,\n onError: null,\n onStatusUpdate: null,\n onExpired: null,\n // Nouvelles options de sécurité\n enableSecurityLogs: true,\n validateInputs: true,\n maxRetries: 3,\n requestTimeout: 10000, // 10 secondes\n // Options d'initialisation sécurisée\n secureInit: false,\n secureInitUrl: (() => {\n if (window.SunuIDConfig?.apiUrl?.includes('api.sunuid.fayma.sn')) {\n return 'https://api.sunuid.fayma.sn/secure-init';\n }\n return window.SunuIDConfig?.apiUrl?.replace('/api', '') + '/secure-init' || 'https://api.sunuid.fayma.sn/secure-init';\n })(),\n token: null,\n // Configuration pour forcer l'utilisation du serveur distant\n forceRemoteServer: true,\n useLocalFallback: false,\n // Nouvelles options pour les callbacks\n redirectAfterSuccess: null,\n verifySignature: false,\n tokenMaxAge: 300, // 5 minutes par défaut\n onAuthenticationSuccess: null,\n onAuthenticationError: null,\n state: null\n };\n\n /**\n * Classe principale SunuID\n */\n class SunuID {\n constructor(config = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.qrCode = null;\n this.refreshTimer = null;\n this.isInitialized = false;\n this.socket = null;\n this.initPromise = null;\n \n // DÉSACTIVÉ : Initialisation automatique pour éviter les boucles\n // L'utilisateur doit appeler init() manuellement\n console.log('🔧 SDK SunuID créé - Appelez init() manuellement');\n }\n\n /**\n * Initialisation du SDK\n */\n async init() {\n // Protection stricte contre les boucles\n if (this.isInitialized) {\n console.log('⚠️ SDK déjà initialisé, ignoré');\n return;\n }\n \n // Protection contre les initialisations simultanées\n if (this.initPromise) {\n console.log('⚠️ Initialisation déjà en cours, attente...');\n return this.initPromise;\n }\n \n // Protection contre les appels multiples rapides\n if (this._initInProgress) {\n console.log('⚠️ Initialisation en cours, ignoré');\n return;\n }\n \n this._initInProgress = true;\n this.initPromise = this._doInit();\n \n try {\n await this.initPromise;\n } finally {\n this._initInProgress = false;\n }\n \n return this.initPromise;\n }\n\n /**\n * Initialisation interne du SDK\n */\n async _doInit() {\n try {\n // Vérifier s'il y a un callback à traiter en premier\n if (this.handleCallback()) {\n console.log('✅ Callback traité, initialisation terminée');\n return;\n }\n\n // Initialisation sécurisée si activée\n if (this.config.secureInit) {\n await this.secureInit();\n } else {\n // Validation sécurisée des paramètres\n if (this.config.validateInputs) {\n this.validateSecurityParams();\n }\n }\n\n // Log de sécurité pour l'initialisation\n this.logSecurityEvent('SDK_INIT_START', {\n apiUrl: this.config.apiUrl,\n type: this.config.type,\n secureInit: this.config.secureInit\n });\n\n // Récupérer les informations du partenaire depuis l'API\n await this.fetchPartnerInfo();\n\n // Obscurcir les credentials dans les logs\n this.obfuscateCredentials();\n\n this.isInitialized = true;\n console.log('SunuID SDK initialisé avec succès');\n console.log('📋 Configuration SDK:', {\n apiUrl: this.config.apiUrl,\n type: this.config.type,\n partnerName: this.config.partnerName,\n clientId: this.config.clientId ? '***' + this.config.clientId.slice(-4) : 'null',\n secretId: this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null',\n secureInit: this.config.secureInit,\n theme: this.config.theme\n });\n \n this.logSecurityEvent('SDK_INIT_SUCCESS');\n \n // Initialiser la connexion WebSocket\n this.initWebSocket();\n \n } catch (error) {\n this.logSecurityEvent('SDK_INIT_ERROR', { error: error.message });\n throw error;\n }\n }\n\n /**\n * Initialisation sécurisée via endpoint serveur\n */\n async secureInit() {\n try {\n this.logSecurityEvent('SECURE_INIT_START');\n \n const initData = {\n type: this.config.type,\n partnerName: this.config.partnerName,\n theme: this.config.theme\n };\n\n const response = await fetch(this.config.secureInitUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify(initData)\n });\n\n if (!response.ok) {\n throw new Error(`Erreur HTTP: ${response.status}`);\n }\n\n const result = await response.json();\n \n console.log('📋 Réponse initialisation sécurisée:', result);\n \n if (!result.success) {\n throw new Error(result.error || 'Erreur lors de l\\'initialisation sécurisée');\n }\n\n // Extraire le token depuis différents chemins possibles\n const token = (result?.response?.response?.token)\n || (result?.response?.token)\n || (result?.data?.token)\n || (result?.token);\n\n if (!token || typeof token !== 'string') {\n throw new Error('Token non trouvé dans la réponse');\n }\n\n // Stocker le token\n this.config.token = token;\n\n // Décoder le token pour récupérer les credentials\n const decodedToken = this.decodeSecureToken(token);\n if (decodedToken) {\n const clientId = decodedToken.clientId || decodedToken.client_id;\n const secretId = decodedToken.secretId || decodedToken.secret_id;\n const apiUrl = decodedToken.apiUrl || decodedToken.api_url;\n\n if (clientId) this.config.clientId = clientId;\n if (secretId) this.config.secretId = secretId;\n if (apiUrl) this.config.apiUrl = apiUrl;\n } else {\n throw new Error('Impossible de décoder le token sécurisé');\n }\n\n // Récupérer expiration et limites depuis la réponse si présentes\n this.config.expiresIn = (result?.response?.expires_in)\n || (result?.data?.expires_in)\n || (result?.expires_in)\n || this.config.expiresIn;\n\n this.config.maxRequests = (result?.response?.max_requests)\n || (result?.data?.max_requests)\n || (result?.max_requests)\n || this.config.maxRequests;\n\n this.config.requestCount = 0;\n\n this.logSecurityEvent('SECURE_INIT_SUCCESS', {\n expiresIn: this.config.expiresIn,\n maxRequests: this.config.maxRequests\n });\n\n console.log('✅ Initialisation sécurisée réussie');\n \n } catch (error) {\n this.logSecurityEvent('SECURE_INIT_ERROR', { error: error.message });\n throw new Error(`Échec de l'initialisation sécurisée: ${error.message}`);\n }\n }\n\n /**\n * Décoder le token sécurisé\n */\n decodeSecureToken(token) {\n try {\n if (!token || typeof token !== 'string') return null;\n\n // Helper: décodage base64/base64url avec padding\n const decodeBase64Any = (str) => {\n let s = String(str).replace(/-/g, '+').replace(/_/g, '/');\n while (s.length % 4 !== 0) s += '=';\n return atob(s);\n };\n\n let tokenData = null;\n\n if (token.includes('.')) {\n // JWT-like: header.payload.signature ou header.payload\n const parts = token.split('.');\n const payloadPart = parts.length >= 2 ? parts[1] : parts[0];\n const json = decodeBase64Any(payloadPart);\n tokenData = JSON.parse(json);\n } else {\n // Base64(\"{json}\") simple\n const json = decodeBase64Any(token);\n tokenData = JSON.parse(json);\n }\n\n // Vérifier l'expiration (en secondes)\n if (tokenData && tokenData.exp && Number(tokenData.exp) < Math.floor(Date.now() / 1000)) {\n console.error('❌ Token expiré');\n return null;\n }\n\n console.log('✅ Token décodé avec succès');\n return tokenData;\n\n } catch (error) {\n console.error('❌ Erreur décodage token:', error);\n return null;\n }\n }\n\n /**\n * Initialiser la connexion WebSocket\n */\n initWebSocket() {\n try {\n // Vérifier si Socket.IO est disponible\n if (typeof io === 'undefined') {\n console.warn('⚠️ Socket.IO non disponible, WebSocket sera initialisé plus tard');\n // Réessayer après un délai\n setTimeout(() => this.initWebSocket(), 1000);\n return;\n }\n \n // Obtenir l'IP du client (simulation)\n const ip = this.getClientIP();\n \n // Initialiser la connexion WebSocket si elle n'existe pas\n if (!this.socket) {\n console.log('🌐 Initialisation Socket.IO...');\n \n // Générer un identifiant aléatoire pour la session WebSocket\n const randomId = 'web_' + Math.random().toString(36).slice(2) + '_' + Date.now();\n this.socket = io('wss://socket.sunuid.com:9446', {\n query: {\n token: randomId,\n type: 'web',\n userId: randomId,\n username: ip\n },\n transports: ['websocket', 'polling']\n });\n\n // Gestion des événements WebSocket\n this.socket.on('connect', () => {\n console.log('🌐 WebSocket connecté avec succès');\n console.log('📊 Socket ID:', this.socket.id);\n this.socket.connected = true;\n });\n\n this.socket.on('disconnect', (reason) => {\n console.log('❌ WebSocket déconnecté:', reason);\n this.socket.connected = false;\n });\n\n this.socket.on('connect_error', (error) => {\n console.error('❌ Erreur connexion WebSocket:', error);\n this.socket.connected = false;\n });\n\n // Écouter les événements spécifiques\n this.socket.on('qr_status_update', (data) => {\n console.log('📱 Mise à jour statut QR reçue:', data);\n this.handleQRStatusUpdate(data);\n });\n\n this.socket.on('qr_scan_success', (data) => {\n console.log('✅ Scan QR réussi reçu:', data);\n this.handleQRScanSuccess(data);\n });\n\n this.socket.on('qr_expired', (data) => {\n console.log('⏰ QR expiré reçu:', data);\n this.handleQRExpired(data);\n });\n\n // Écouter l'événement qr_scan_initiated spécifiquement\n this.socket.on('qr_scan_initiated', (data) => {\n console.log('🔍 QR Scan Initiated reçu:', data);\n this.showQRLoader();\n });\n\n // Écouter l'événement message générique (fallback)\n this.socket.on('message', (data) => {\n console.log('📨 Message socket reçu:', data);\n if (data && data.type === 'qr_scan_initiated') {\n console.log('🔍 QR Scan Initiated détecté dans message:', data);\n this.showQRLoader();\n }\n });\n\n // Écouter tous les événements socket pour le debugging\n this.socket.onAny = this.socket.onAny || function(eventName, callback) {\n // Fallback pour les versions de Socket.IO qui n'ont pas onAny\n console.log(`🌐 Socket Event [${eventName}]:`, callback);\n };\n \n // Logger tous les événements reçus\n this.socket.onAny((eventName, ...args) => {\n console.log(`🌐 Socket Event [${eventName}]:`, args);\n });\n } else {\n console.log('🌐 WebSocket déjà connecté');\n }\n } catch (error) {\n console.error('❌ Erreur initialisation WebSocket:', error);\n }\n }\n\n /**\n * Obtenir l'IP du client (simulation)\n */\n getClientIP() {\n // Simulation - en production, vous pourriez utiliser un service d'IP\n return '127.0.0.1';\n }\n\n /**\n * Obtenir le nom du type à partir du numéro\n */\n getTypeName(type) {\n switch(type) {\n case 1: return 'KYC';\n case 2: return 'AUTH';\n case 3: return 'SIGNATURE';\n default: return `TYPE-${type}`;\n }\n }\n\n /**\n * Validation sécurisée des paramètres\n */\n validateSecurityParams() {\n const errors = [];\n \n // Validation du clientId\n if (!this.config.clientId || typeof this.config.clientId !== 'string') {\n errors.push('clientId invalide ou manquant');\n } else if (this.config.clientId.length < 10) {\n errors.push('clientId trop court');\n }\n \n // Validation du secretId\n if (!this.config.secretId || typeof this.config.secretId !== 'string') {\n errors.push('secretId invalide ou manquant');\n } else if (this.config.secretId.length < 32) {\n errors.push('secretId trop court (minimum 32 caractères)');\n }\n \n // Validation de l'URL API\n if (!this.config.apiUrl || !this.isValidUrl(this.config.apiUrl)) {\n errors.push('apiUrl invalide');\n }\n \n // Validation du type\n if (![1, 2, 3].includes(this.config.type)) {\n errors.push('type invalide (doit être 1, 2 ou 3)');\n }\n \n if (errors.length > 0) {\n this.logSecurityEvent('VALIDATION_ERROR', { errors });\n throw new Error(`Paramètres de sécurité invalides: ${errors.join(', ')}`);\n }\n \n this.logSecurityEvent('VALIDATION_SUCCESS');\n }\n\n /**\n * Validation d'URL sécurisée\n */\n isValidUrl(string) {\n try {\n const url = new URL(string);\n return url.protocol === 'https:' || url.protocol === 'http:';\n } catch (_) {\n return false;\n }\n }\n\n /**\n * Logs de sécurité\n */\n logSecurityEvent(event, data = {}) {\n if (!this.config.enableSecurityLogs) return;\n \n const securityLog = {\n timestamp: new Date().toISOString(),\n event: event,\n data: data,\n userAgent: navigator.userAgent,\n url: window.location.href\n };\n \n console.warn('🔒 [SECURITY]', securityLog);\n \n // Stocker les logs de sécurité (optionnel)\n if (!window.SunuIDSecurityLogs) {\n window.SunuIDSecurityLogs = [];\n }\n window.SunuIDSecurityLogs.push(securityLog);\n }\n\n /**\n * Chiffrement simple des credentials (pour éviter l'exposition en clair)\n */\n obfuscateCredentials() {\n // Stocker les vraies valeurs pour les logs de sécurité\n this.config.originalClientId = this.config.clientId;\n this.config.originalSecretId = this.config.secretId;\n \n // Créer des versions obfusquées pour l'affichage uniquement\n if (this.config.clientId) {\n this.config.clientIdDisplay = this.config.clientId.replace(/(.{3}).*(.{3})/, '$1***$2');\n }\n if (this.config.secretId) {\n this.config.secretIdDisplay = this.config.secretId.replace(/(.{4}).*(.{4})/, '$1***$2');\n }\n }\n\n /**\n * Validation des entrées utilisateur\n */\n sanitizeInput(input) {\n if (typeof input !== 'string') return input;\n \n // Protection contre les injections XSS basiques\n return input\n .replace(/[<>]/g, '') // Supprimer les balises HTML\n .replace(/javascript:/gi, '') // Supprimer les protocoles dangereux\n .trim();\n }\n\n /**\n * Gérer la mise à jour du statut QR\n */\n handleQRStatusUpdate(data) {\n console.log('📱 QR Status Update:', data);\n if (this.config.onStatusUpdate) {\n this.config.onStatusUpdate(data);\n }\n }\n\n /**\n * Gérer le succès du scan QR\n */\n handleQRScanSuccess(data) {\n console.log('✅ QR Scan Success reçu:', data);\n \n try {\n // Extraire les données d'authentification du format WebSocket\n const authData = this.extractAuthDataFromWebSocket(data);\n \n // Traiter l'authentification comme un callback\n this.processAuthentication(authData);\n \n // Afficher un message de succès\n this.showSuccessMessage(authData);\n \n // Appeler le callback de succès (pour compatibilité)\n if (this.config.onSuccess) {\n this.config.onSuccess(authData);\n }\n \n console.log('✅ Authentification WebSocket traitée avec succès');\n \n } catch (error) {\n console.error('❌ Erreur lors du traitement WebSocket:', error);\n \n // Appeler le callback d'erreur\n if (this.config.onAuthenticationError) {\n this.config.onAuthenticationError(error, data);\n }\n }\n }\n\n /**\n * Gérer l'expiration du QR\n */\n handleQRExpired(data) {\n console.log('⏰ QR Expired:', data);\n if (this.config.onExpired) {\n this.config.onExpired(data);\n }\n }\n\n /**\n * Émettre un événement WebSocket\n */\n emitWebSocketEvent(event, data) {\n if (this.socket && this.socket.connected) {\n this.socket.emit(event, data);\n console.log(`📤 Événement WebSocket émis: ${event}`, data);\n } else {\n console.warn('⚠️ WebSocket non connecté, impossible d\\'émettre l\\'événement:', event);\n }\n }\n\n /**\n * Obtenir le statut de la connexion WebSocket\n */\n getWebSocketStatus() {\n if (!this.socket) {\n return 'not_initialized';\n }\n return this.socket.connected ? 'connected' : 'disconnected';\n }\n\n /**\n * Forcer l'initialisation WebSocket (si Socket.IO devient disponible plus tard)\n */\n forceWebSocketInit() {\n if (typeof io !== 'undefined' && !this.socket) {\n console.log('🔄 Forçage de l\\'initialisation WebSocket...');\n this.initWebSocket();\n }\n }\n\n /**\n * Générer un QR code avec le type configuré\n */\n async generateQR(containerId = 'sunuid-qr-container', options = {}) {\n // Attendre l'initialisation si nécessaire\n if (this.initPromise) {\n await this.initPromise;\n this.initPromise = null;\n }\n \n if (!this.isInitialized) {\n throw new Error('SunuID: SDK non initialisé');\n }\n \n console.log('🎯 generateQR appelé avec containerId:', containerId);\n \n // Attendre que les connexions soient prêtes\n console.log('🔍 Attente connexions API et WebSocket...');\n try {\n const connectionStatus = await this.waitForConnections(5000); // 5 secondes max\n console.log('✅ Connexions prêtes:', connectionStatus);\n } catch (connectionError) {\n console.error('❌ Erreur connexions:', connectionError.message);\n throw new Error('Connexions non disponibles - Impossible de générer le QR code');\n }\n\n try {\n // Utiliser uniquement le socketID comme contenu du QR\n const socketId = this.socket ? this.socket.id : 'timeout-socket-id';\n const qrContent = socketId;\n \n console.log('📄 Contenu QR préparé:', qrContent);\n console.log('🔌 Socket ID:', socketId);\n \n // Générer le QR avec le contenu complet\n const partnerName = this.config.partnerName || 'Partner_unknown';\n const response = await this.makeRequest('/qr-generate', {\n type: this.config.type,\n data: qrContent, // Essayer data au lieu de content\n label: `${this.getTypeName(this.config.type)} ${partnerName}`, // Label du QR avec nom du partenaire\n ...options\n });\n\n if (response.success) {\n // Debug: Afficher la structure complète de la réponse\n console.log('📋 Réponse QR API complète:', response);\n console.log('📋 Structure response.data:', response.data);\n \n // Construire l'URL complète du QR code\n let qrImageUrl = response.data.qrCodeUrl;\n \n // Si l'URL est relative, la rendre absolue\n if (qrImageUrl && qrImageUrl.startsWith('/')) {\n qrImageUrl = `${this.config.apiUrl}${qrImageUrl}`;\n }\n \n // Vérifier si l'URL du QR code existe\n if (!qrImageUrl) {\n console.warn('⚠️ qrCodeUrl non trouvé dans la réponse, recherche d\\'alternatives...');\n \n // Essayer d'autres champs possibles\n qrImageUrl = response.data.qr_url || \n response.data.qrUrl || \n response.data.url || \n response.data.image_url ||\n response.data.imageUrl;\n \n if (qrImageUrl) {\n console.log('✅ URL QR trouvée dans un champ alternatif:', qrImageUrl);\n } else {\n console.error('❌ Aucune URL QR trouvée dans la réponse');\n throw new Error('URL du QR code non trouvée dans la réponse API');\n }\n }\n \n this.currentQRUrl = qrImageUrl;\n \n console.log('✅ QR code généré par API principale:', qrImageUrl);\n console.log('📄 Contenu QR final:', qrContent);\n console.log('🏷️ Label QR:', response.data.label || 'N/A');\n console.log('🆔 Session ID:', response.data.sessionId || 'N/A');\n \n // Afficher le QR code\n this.displayQRCode(containerId, qrImageUrl, this.config.type, options);\n \n this.startAutoRefresh(containerId, this.config.type, options);\n \n // Émettre un événement WebSocket pour la génération du QR\n this.emitWebSocketEvent('qr_generated', {\n type: this.config.type,\n qrCodeUrl: qrImageUrl,\n socketId: socketId,\n qrContent: qrContent,\n label: response.data.label,\n sessionId: response.data.sessionId,\n timestamp: Date.now()\n });\n \n return {\n ...response.data,\n qrCodeUrl: qrImageUrl,\n qrContent: qrContent,\n label: response.data.label,\n sessionId: response.data.sessionId\n };\n } else {\n throw new Error(response.message || 'Erreur lors de la génération du QR code');\n }\n } catch (error) {\n console.error('Erreur API détectée:', error.message);\n console.error('Stack trace complet:', error.stack);\n console.error('Configuration SDK:', {\n apiUrl: this.config.apiUrl,\n type: this.config.type,\n secureInit: this.config.secureInit,\n clientId: this.config.clientId ? '***' + this.config.clientId.slice(-4) : 'null',\n secretId: this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null'\n });\n \n // Fallback vers le service local seulement si activé\n if (this.config.useLocalFallback) {\n console.log('🔍 Vérification fallback local...');\n console.log('🔍 Hostname:', window.location.hostname);\n console.log('🔍 Protocol:', window.location.protocol);\n console.log('🔍 URL complète:', window.location.href);\n \n const isLocal = window.location.hostname === 'localhost' || \n window.location.hostname === '127.0.0.1' || \n window.location.protocol === 'file:';\n \n console.log('🔍 Est local:', isLocal);\n \n if (isLocal) {\n console.log('🔄 Tentative fallback vers service QR local...');\n console.log('❌ Fallback local non implémenté - utilisation serveur distant uniquement');\n } else {\n console.log('❌ Pas en local, pas de fallback');\n }\n } else {\n console.log('🔒 Fallback local désactivé, utilisation serveur distant uniquement');\n }\n \n console.log('Affichage du message \"Service non disponible\" pour type ' + this.config.type);\n this.displayServiceUnavailable(containerId, this.config.type);\n throw new Error('Service non disponible');\n }\n }\n\n\n\n /**\n * Générer un QR code avec un type personnalisé\n */\n async generateCustomQR(containerId, type, options = {}) {\n // Attendre l'initialisation si nécessaire\n if (this.initPromise) {\n await this.initPromise;\n this.initPromise = null;\n }\n \n if (!this.isInitialized) {\n throw new Error('SunuID: SDK non initialisé');\n }\n\n try {\n const response = await this.makeRequest('/qr-generate', {\n type: type, // Type personnalisé (1, 2, 3, etc.)\n ...options\n });\n\n if (response.success) {\n // Construire l'URL complète de l'image QR avec la base URL pour les images\n const imageBaseUrl = 'https://sunuid.fayma.sn';\n const qrImageUrl = `${imageBaseUrl}${response.data.qrcode}`;\n this.displayQRCode(containerId, qrImageUrl, type, options);\n \n // Le QR code est déjà généré par l'API principale\n console.log('✅ QR code personnalisé généré par API principale:', qrImageUrl);\n console.log('📄 Code de session:', response.data.code);\n console.log('🆔 Service ID:', response.data.service_id);\n \n this.startAutoRefresh(containerId, type, options);\n return {\n ...response.data,\n qrCodeUrl: qrImageUrl,\n sessionId: response.data.service_id\n };\n } else {\n throw new Error(response.message || 'Erreur lors de la génération du QR code');\n }\n } catch (error) {\n console.error('Erreur API détectée:', error.message);\n console.error('Stack trace complet:', error.stack);\n console.error('Configuration SDK (Custom):', {\n apiUrl: this.config.apiUrl,\n type: type,\n secureInit: this.config.secureInit,\n clientId: this.config.clientId ? '***' + this.config.clientId.slice(-4) : 'null',\n secretId: this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null'\n });\n console.log('Affichage du message \"Service non disponible\" pour type ' + type);\n this.displayServiceUnavailable(containerId, type);\n throw new Error('Service non disponible');\n }\n }\n\n // Alias pour maintenir la compatibilité\n async generateAuthQR(containerId, options = {}) {\n return this.generateQR(containerId, options);\n }\n\n async generateKYCQR(containerId, options = {}) {\n // Sauvegarder le type actuel\n const originalType = this.config.type;\n // Changer temporairement le type pour KYC\n this.config.type = 1;\n try {\n return await this.generateQR(containerId, options);\n } finally {\n // Restaurer le type original\n this.config.type = originalType;\n }\n }\n\n async generateSignatureQR(containerId, options = {}) {\n // Sauvegarder le type actuel\n const originalType = this.config.type;\n // Changer temporairement le type pour Signature\n this.config.type = 3;\n try {\n return await this.generateQR(containerId, options);\n } finally {\n // Restaurer le type original\n this.config.type = originalType;\n }\n }\n\n /**\n * Vérifier le statut d'un QR code\n */\n async checkQRStatus(sessionId) {\n if (!this.isInitialized) {\n throw new Error('SunuID: SDK non initialisé');\n }\n\n try {\n const response = await this.makeRequest('/qr-status', {\n serviceId: sessionId\n });\n\n if (response.success) {\n return response.data;\n } else {\n throw new Error(response.message || 'Erreur lors de la vérification du statut');\n }\n } catch (error) {\n this.handleError(error);\n throw error;\n }\n }\n\n /**\n * Générer un QR code avec un contenu spécifique\n */\n async generateQRWithContent(content, containerId, type, options = {}) {\n console.log('🎨 Génération QR avec contenu:', content);\n \n try {\n // Essayer d'abord le service QR local\n if (window.location.hostname === 'localhost' || \n window.location.hostname === '127.0.0.1' || \n window.location.protocol === 'file:') {\n \n console.log('🏠 Utilisation service QR local...');\n const localQRUrl = await this.generateQRLocal(content, containerId, type, options);\n if (localQRUrl) {\n return localQRUrl;\n }\n }\n \n // Fallback vers le service QR distant\n console.log('🌐 Utilisation service QR distant...');\n return await this.generateQRRemote(content, containerId, type, options);\n \n } catch (error) {\n console.error('❌ Erreur génération QR:', error);\n // Fallback vers affichage simple du contenu\n this.displayQRContent(containerId, content, type, options);\n return null;\n }\n }\n \n /**\n * Générer QR code avec service local\n */\n async generateQRLocal(content, containerId, type, options = {}) {\n try {\n const response = await fetch('http://localhost:8000/api/generate/text', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: `text=${encodeURIComponent(content)}&size=300`\n });\n \n if (response.ok) {\n const data = await response.json();\n const qrUrl = `data:image/png;base64,${data.qrcode}`;\n this.displayQRCode(containerId, qrUrl, type, options);\n return qrUrl;\n }\n } catch (error) {\n console.log('❌ Service QR local non disponible:', error.message);\n }\n return null;\n }\n \n /**\n * Générer QR code avec service distant\n */\n async generateQRRemote(content, containerId, type, options = {}) {\n try {\n const response = await fetch('https://api.sunuid.fayma.sn/qr-generate', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n text: content,\n size: 300,\n type: type\n })\n });\n \n if (response.ok) {\n const data = await response.json();\n const qrUrl = `data:image/png;base64,${data.qrcode}`;\n this.displayQRCode(containerId, qrUrl, type, options);\n return qrUrl;\n }\n } catch (error) {\n console.error('❌ Erreur service QR distant:', error);\n }\n \n // Fallback vers affichage du contenu\n this.displayQRContent(containerId, content, type, options);\n return null;\n }\n \n /**\n * Afficher le contenu QR en texte (fallback)\n */\n displayQRContent(containerId, content, type, options = {}) {\n const container = document.getElementById(containerId);\n if (!container) {\n throw new Error(`Conteneur avec l'ID \"${containerId}\" non trouvé`);\n }\n\n const typeName = this.getTypeName(type);\n container.innerHTML = `\n <div class=\"sunuid-qr-code\">\n <div class=\"sunuid-qr-header\">\n <h3>${typeName}</h3>\n </div>\n <div class=\"sunuid-qr-content\" style=\"text-align: center; padding: 20px; background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 5px; margin: 10px 0;\">\n <p><strong>Contenu QR Code:</strong></p>\n <p style=\"font-family: monospace; font-size: 14px; word-break: break-all;\">${content}</p>\n </div>\n <div class=\"sunuid-qr-instructions\">\n <p>Contenu QR généré avec le format: {type}-{code}-{socketid}</p>\n </div>\n </div>\n `;\n \n console.log('✅ Contenu QR affiché:', content);\n }\n \n /**\n * Afficher un QR code dans un conteneur\n */\n displayQRCode(containerId, qrUrl, type, options = {}) {\n const container = document.getElementById(containerId);\n if (!container) {\n throw new Error(`Conteneur avec l'ID \"${containerId}\" non trouvé`);\n }\n\n // Nettoyer le conteneur\n container.innerHTML = '';\n\n // Créer l'élément QR code\n const qrElement = document.createElement('div');\n qrElement.className = 'sunuid-qr-code';\n \n // Afficher l'image QR avec les informations\n const typeName = this.getTypeName(type);\n qrElement.innerHTML = `\n <div class=\"sunuid-qr-header\">\n <h3>${type === 1 ? 'Vérification KYC' : type === 2 ? 'Authentification' : type === 3 ? 'Signature' : 'Service Type ' + type}</h3>\n </div>\n <div class=\"sunuid-qr-image\">\n <img src=\"${qrUrl}\" alt=\"QR Code ${typeName}\" style=\"max-width: 300px; border: 1px solid #ddd; border-radius: 5px;\" />\n </div>\n \n `;\n\n container.appendChild(qrElement);\n\n // Appliquer le thème\n this.applyTheme(options.theme || this.config.theme);\n \n console.log('✅ QR code affiché:', qrUrl);\n }\n\n /**\n * Générer un QR code personnalisé avec bibliothèque locale\n */\n async generateCustomQRCode(content, label, options = {}) {\n console.log('🎨 Début génération QR personnalisé...');\n console.log('📄 Contenu:', content);\n console.log('🏷️ Label:', label);\n \n // Chercher le conteneur QR\n let qrContainer = document.getElementById('sunuid-qr-container');\n if (!qrContainer) {\n qrContainer = document.getElementById('qr-container');\n }\n if (!qrContainer) {\n console.error('❌ QR container not found');\n return;\n }\n \n console.log('✅ QR container trouvé');\n\n // Nettoyer le conteneur\n qrContainer.innerHTML = '<div style=\"text-align: center; padding: 20px;\"><p>Génération QR code...</p></div>';\n\n try {\n // Utiliser directement l'API principale (plus fiable)\n console.log('🎨 Tentative génération via API principale...');\n await this.generateQRPHP(content, label, qrContainer);\n console.log('✅ QR code généré avec succès');\n \n } catch (error) {\n console.error('❌ Erreur génération API:', error);\n \n // Fallback final : image par défaut\n console.log('⚠️ Affichage image par défaut');\n this.displayDefaultQR(qrContainer, content, label);\n }\n }\n\n /**\n * Générer un QR code côté client (méthode principale)\n */\n async generateQRClientSide(content, label, qrContainer) {\n // Charger QRCode si nécessaire\n await this.ensureQRCodeLibrary();\n \n if (typeof QRCode === 'undefined') {\n throw new Error('QRCode library non disponible');\n }\n \n // Créer un canvas\n const canvas = document.createElement('canvas');\n canvas.width = 300;\n canvas.height = 320;\n const ctx = canvas.getContext('2d');\n \n // Fond blanc\n ctx.fillStyle = '#FFFFFF';\n ctx.fillRect(0, 0, 300, 320);\n \n // Générer le QR code\n return new Promise((resolve, reject) => {\n QRCode.toCanvas(canvas, content, {\n width: 280,\n margin: 10,\n color: {\n dark: '#000000',\n light: '#FFFFFF'\n }\n }, (error) => {\n if (error) {\n reject(error);\n return;\n }\n \n // Ajouter le label\n ctx.fillStyle = '#333333';\n ctx.font = 'bold 14px Arial';\n ctx.textAlign = 'center';\n ctx.fillText(label, 150, 305);\n \n // Convertir en data URL\n const dataUrl = canvas.toDataURL('image/png');\n \n // Stocker l'URL\n this.currentQRUrl = dataUrl;\n \n // Afficher le QR code\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px;\">\n <img src=\"${dataUrl}\" alt=\"QR Code\" style=\"max-width: 300px; border: 2px solid #ddd; border-radius: 10px;\">\n </div>\n `;\n \n // Afficher les instructions\n this.showQRInstructions(qrContainer);\n \n resolve();\n });\n });\n }\n\n /**\n * Générer un QR code via endpoint serveur (fallback)\n */\n async generateQRPHP(content, label, qrContainer) {\n // Construire l'URL - Utiliser l'API principale qui fonctionne\n let qrGeneratorUrl;\n if (this.config.forceRemoteServer) {\n qrGeneratorUrl = 'https://api.sunuid.fayma.sn/qr-generate';\n } else if (this.config.apiUrl.includes('api.sunuid.fayma.sn')) {\n qrGeneratorUrl = 'https://api.sunuid.fayma.sn/qr-generate';\n } else if (this.config.apiUrl.includes('localhost') || this.config.apiUrl.includes('127.0.0.1')) {\n qrGeneratorUrl = 'http://localhost:8000/api/generate/text';\n } else {\n qrGeneratorUrl = this.config.apiUrl + '/qr-generate';\n }\n \n console.log('🔗 URL QR Generator:', qrGeneratorUrl);\n \n // Adapter le format selon l'URL\n let requestBody;\n let contentType;\n \n if (qrGeneratorUrl.includes('localhost:8000')) {\n // Service local - format form-data\n contentType = 'application/x-www-form-urlencoded';\n requestBody = new URLSearchParams({\n text: content,\n size: 300,\n margin: 10,\n foreground_color: '000000',\n background_color: 'FFFFFF'\n });\n } else {\n // Service distant - format JSON avec les paramètres de l'API principale\n contentType = 'application/json';\n requestBody = JSON.stringify({\n type: this.config.type,\n client_id: this.config.clientId,\n secret_id: this.config.secretId,\n content: content,\n label: label\n });\n }\n \n const response = await fetch(qrGeneratorUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': contentType,\n 'Accept': 'application/json'\n },\n body: requestBody\n });\n \n if (!response.ok) {\n throw new Error(`Erreur HTTP: ${response.status}`);\n }\n \n const responseData = await response.json();\n \n if (!responseData.success) {\n throw new Error(`Erreur QR: ${responseData.error}`);\n }\n \n // Adapter selon le format de réponse\n let qrImageUrl;\n if (qrGeneratorUrl.includes('localhost:8000')) {\n // Service local\n qrImageUrl = responseData.data_uri;\n } else {\n // Service distant - utiliser le format de l'API principale\n const imageBaseUrl = 'https://sunuid.fayma.sn';\n qrImageUrl = `${imageBaseUrl}${responseData.data.qrcode}`;\n }\n \n // Stocker l'URL\n this.currentQRUrl = qrImageUrl;\n \n // Afficher le QR code\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px;\">\n <img src=\"${qrImageUrl}\" alt=\"QR Code\" style=\"max-width: 300px; border: 2px solid #ddd; border-radius: 10px;\">\n </div>\n `;\n \n // Afficher les instructions\n this.showQRInstructions(qrContainer);\n }\n\n /**\n * Afficher une image QR par défaut (fallback final)\n */\n displayDefaultQR(qrContainer, content, label) {\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px; color: #666;\">\n <div style=\"width: 300px; height: 300px; background: #f0f0f0; border: 2px solid #ddd; border-radius: 10px; display: flex; align-items: center; justify-content: center; margin: 0 auto;\">\n <div>\n <p style=\"font-size: 24px; margin: 0;\">📱</p>\n <p style=\"font-size: 14px; margin: 10px 0 0 0;\">QR Code</p>\n </div>\n </div>\n <p style=\"margin-top: 10px; font-size: 12px;\">${label}</p>\n <p style=\"font-size: 10px; color: #999; margin-top: 5px;\">Contenu: ${content}</p>\n </div>\n `;\n }\n\n /**\n * S'assurer que la bibliothèque QRCode est disponible\n */\n async ensureQRCodeLibrary() {\n if (typeof QRCode !== 'undefined') {\n console.log('✅ QRCode library déjà disponible');\n return true;\n }\n \n console.log('📦 Chargement QRCode library...');\n \n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://cdn.jsdelivr.net/npm/qrcode@1.5.3/lib/browser.min.js';\n script.onload = () => {\n setTimeout(() => {\n if (typeof QRCode !== 'undefined') {\n console.log('✅ QRCode library chargée');\n resolve(true);\n } else {\n console.error('❌ QRCode non disponible après chargement');\n reject(new Error('QRCode library non disponible après chargement'));\n }\n }, 200);\n };\n script.onerror = () => {\n console.error('❌ Erreur chargement QRCode library');\n reject(new Error('Erreur chargement QRCode library'));\n };\n document.head.appendChild(script);\n });\n }\n\n /**\n * Afficher les instructions pour le QR code\n */\n showQRInstructions(qrContainer) {\n const instructionsElement = qrContainer.parentElement.querySelector('.sunuid-qr-instructions');\n const statusElement = qrContainer.parentElement.querySelector('.sunuid-qr-status');\n \n if (instructionsElement) {\n instructionsElement.style.display = 'block';\n instructionsElement.classList.add('sunuid-qr-ready');\n }\n if (statusElement) {\n statusElement.style.display = 'block';\n statusElement.classList.add('sunuid-qr-ready');\n }\n }\n\n /**\n * Ajouter le logo au centre du QR code\n */\n addLogoToCenter(ctx, x, y, width, height) {\n try {\n // Créer une image pour le logo\n const logo = new Image();\n logo.onload = () => {\n const logoSize = 40;\n const logoX = x + (width - logoSize) / 2;\n const logoY = y + (width - logoSize) / 2;\n\n // Dessiner un fond blanc pour le logo\n ctx.fillStyle = 'white';\n ctx.fillRect(logoX - 2, logoY - 2, logoSize + 4, logoSize + 4);\n\n // Dessiner le logo\n ctx.drawImage(logo, logoX, logoY, logoSize, logoSize);\n };\n logo.src = 'src/logoqr.png';\n } catch (error) {\n console.warn('Logo non disponible:', error);\n }\n }\n\n /**\n * Afficher l'image de fallback\n */\n displayFallbackImage() {\n console.log('⚠️ Affichage de l\\'image de fallback');\n const qrContainer = document.getElementById('sunuid-qr-container');\n if (qrContainer) {\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px; color: #666;\">\n <p>⚠️ Génération QR personnalisé non disponible</p>\n <p>Utilisation de l'image par défaut</p>\n <p><strong>Debug:</strong> QRCode disponible: ${typeof QRCode !== 'undefined'}</p>\n <p><strong>Debug:</strong> Container trouvé: ${qrContainer !== null}</p>\n </div>\n `;\n }\n }\n\n /**\n * Afficher \"Service non disponible\"\n */\n displayServiceUnavailable(containerId, type) {\n console.log(`displayServiceUnavailable appelée pour ${containerId}, type: ${type}`);\n const container = document.getElementById(containerId);\n if (!container) {\n console.error(`Container ${containerId} non trouvé`);\n return;\n }\n\n container.innerHTML = `\n <div class=\"sunuid-service-unavailable\" style=\"\n text-align: center;\n padding: 40px 20px;\n background: #f8f9fa;\n border: 2px dashed #dee2e6;\n border-radius: 10px;\n color: #6c757d;\n font-family: Arial, sans-serif;\n \">\n <div style=\"font-size: 48px; margin-bottom: 20px;\">⚠️</div>\n <h3 style=\"margin: 0 0 10px 0; color: #495057;\">Service Non Disponible</h3>\n <p style=\"margin: 0; font-size: 14px;\">\n Le service d'authentification est temporairement indisponible.<br>\n Veuillez réessayer plus tard.\n </p>\n <div style=\"margin-top: 20px; font-size: 12px; color: #adb5bd;\">\n Type: ${String(type).toUpperCase()}\n </div>\n </div>\n `;\n }\n\n /**\n * Rafraîchir un QR code\n */\n async refreshQR(containerId, options = {}) {\n try {\n // Vérifier si on a déjà un QR code généré\n if (this.currentQRUrl) {\n console.log('🔄 Vérification du statut du QR code existant...');\n \n // Option 1: Vérifier le statut du QR code via l'API\n // (à implémenter si l'API le supporte)\n \n // Option 2: Régénérer le QR code seulement si nécessaire\n // Pour l'instant, on régénère pour s'assurer qu'il est à jour\n const result = await this.generateQR(containerId, options);\n return result;\n } else {\n console.log('🔄 Pas de QR code existant, génération d\\'un nouveau...');\n const result = await this.generateQR(containerId, options);\n return result;\n }\n } catch (error) {\n console.error('Erreur lors du rafraîchissement:', error.message);\n this.displayServiceUnavailable(containerId, this.config.type);\n throw error;\n }\n }\n\n /**\n * Démarrer le rafraîchissement automatique\n */\n startAutoRefresh(containerId, type, options) {\n if (!this.config.autoRefresh) return;\n\n // Arrêter le timer existant s'il y en a un\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n console.log('🔄 Timer de rafraîchissement précédent arrêté');\n }\n\n this.refreshTimer = setInterval(async () => {\n try {\n console.log('🔄 Rafraîchissement automatique du QR code...');\n await this.refreshQR(containerId, type, options);\n } catch (error) {\n console.warn('Erreur lors du rafraîchissement automatique:', error);\n }\n }, this.config.refreshInterval);\n \n console.log(`🔄 Timer de rafraîchissement démarré (${this.config.refreshInterval}ms)`);\n }\n\n /**\n * Démarrer le timer de compte à rebours\n */\n\n\n /**\n * Effectuer une requête API sécurisée\n */\n async makeRequest(endpoint, data) {\n // Validation de sécurité\n if (!this.isInitialized) {\n this.logSecurityEvent('REQUEST_BEFORE_INIT', { endpoint });\n throw new Error('SDK non initialisé');\n }\n\n // Vérifier les limites de requêtes pour l'initialisation sécurisée\n if (this.config.secureInit) {\n this.config.requestCount++;\n if (this.config.requestCount > this.config.maxRequests) {\n this.logSecurityEvent('API_REQUEST_LIMIT_EXCEEDED', { \n requestCount: this.config.requestCount,\n maxRequests: this.config.maxRequests \n });\n throw new Error('Limite de requêtes dépassée');\n }\n }\n\n // Sanitisation des données\n const sanitizedData = this.sanitizeRequestData(data);\n \n // Debug: Afficher les données envoyées\n console.log('🔍 Debug makeRequest - endpoint:', endpoint);\n console.log('🔍 Debug makeRequest - apiUrl:', this.config.apiUrl);\n console.log('🔍 Debug makeRequest - url:', `${this.config.apiUrl}${endpoint}`);\n console.log('🔍 Debug makeRequest - data:', JSON.stringify(sanitizedData, null, 2));\n console.log('🔍 Debug makeRequest - secureInit:', this.config.secureInit);\n console.log('🔍 Debug makeRequest - isInitialized:', this.isInitialized);\n \n // Utiliser l'endpoint depuis la configuration si disponible\n const endpointPath = window.SunuIDConfig?.endpoints?.[endpoint.replace('/', '')] || endpoint;\n const url = `${this.config.apiUrl}${endpointPath}`;\n \n // Debug: Afficher l'URL finale\n console.log('🔍 URL finale construite:', url);\n console.log('🔍 EndpointPath:', endpointPath);\n console.log('🔍 SunuIDConfig endpoints:', JSON.stringify(window.SunuIDConfig?.endpoints));\n \n // Log de sécurité pour la requête\n this.logSecurityEvent('API_REQUEST_START', {\n endpoint: endpointPath,\n url: url,\n dataKeys: Object.keys(sanitizedData),\n secureInit: this.config.secureInit\n });\n \n let retryCount = 0;\n const maxRetries = this.config.maxRetries;\n \n while (retryCount <= maxRetries) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.requestTimeout);\n \n // Headers minimaux (API SunuID n'accepte que les headers essentiels)\n const headers = {\n 'Content-Type': 'application/json'\n };\n\n // Note: En mode sécurisé, les credentials sont dans le body\n // Pas besoin d'ajouter de header spécial pour éviter les problèmes CORS\n // if (this.config.secureInit && this.config.token) {\n // headers['X-Secure-Token'] = this.config.token;\n // }\n \n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(sanitizedData),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData;\n try {\n errorData = JSON.parse(errorText);\n } catch (e) {\n errorData = { message: errorText };\n }\n \n this.logSecurityEvent('API_REQUEST_ERROR', {\n status: response.status,\n statusText: response.statusText,\n error: errorData.message\n });\n \n throw new Error(errorData.message || `Erreur HTTP: ${response.status}`);\n }\n\n const result = await response.json();\n \n this.logSecurityEvent('API_REQUEST_SUCCESS', {\n endpoint: endpointPath,\n responseKeys: Object.keys(result)\n });\n \n return result;\n \n } catch (error) {\n retryCount++;\n \n if (error.name === 'AbortError') {\n this.logSecurityEvent('API_REQUEST_TIMEOUT', { retryCount });\n if (retryCount > maxRetries) {\n throw new Error('Timeout de la requête API');\n }\n continue;\n }\n \n if (retryCount > maxRetries) {\n this.logSecurityEvent('API_REQUEST_MAX_RETRIES', { \n retryCount, \n error: error.message \n });\n throw error;\n }\n \n // Attendre avant de réessayer\n await new Promise(resolve => setTimeout(resolve, 1000 * retryCount));\n }\n }\n }\n\n /**\n * Sanitisation des données de requête\n */\n sanitizeRequestData(data) {\n const sanitized = {};\n \n // D'abord, copier tous les champs de data\n for (const [key, value] of Object.entries(data)) {\n if (typeof value === 'string') {\n sanitized[key] = this.sanitizeInput(value);\n } else if (typeof value === 'object' && value !== null) {\n sanitized[key] = this.sanitizeRequestData(value);\n } else {\n sanitized[key] = value;\n }\n }\n \n // Ensuite, ajouter/écraser les credentials (API SunuID les attend ici)\n // Utiliser les vraies valeurs (originales) si disponibles, sinon les valeurs directes\n sanitized.client_id = this.config.originalClientId || this.config.clientId;\n sanitized.secret_id = this.config.originalSecretId || this.config.secretId;\n \n // Debug: Vérifier les credentials et les données\n console.log('🔍 Credentials dans sanitizeRequestData - clientId:', this.config.clientId);\n console.log('🔍 Credentials dans sanitizeRequestData - secretId:', this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null');\n console.log('🔍 Credentials dans sanitizeRequestData - sanitizedClientId:', sanitized.client_id);\n console.log('🔍 Credentials dans sanitizeRequestData - sanitizedSecretId:', sanitized.secret_id ? '***' + sanitized.secret_id.slice(-4) : 'null');\n console.log('🔍 Credentials dans sanitizeRequestData - data complet:', JSON.stringify(sanitized, null, 2));\n \n return sanitized;\n }\n\n /**\n * Générer un ID de requête unique\n */\n generateRequestId() {\n return 'req_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n }\n\n /**\n * Générer un code de session unique\n */\n generateSessionCode() {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substr(2, 9);\n const code = `${timestamp}_${random}`;\n return btoa(code); // Encoder en base64\n }\n\n /**\n * Récupérer les informations du partenaire depuis l'API\n */\n async fetchPartnerInfo() {\n try {\n const response = await this.makeRequest('/debug', {\n type: this.config.type,\n client_id: this.config.clientId,\n secret_id: this.config.secretId\n });\n\n console.log('📋 Réponse debug API:', response);\n\n // Vérifier la structure de la réponse\n if (response.success && response.data) {\n const data = response.data;\n \n // Essayer de récupérer le partner_id depuis différentes structures possibles\n let partnerId = null;\n \n if (data.partner_id) {\n partnerId = data.partner_id;\n } else if (data.authentication && data.authentication.auth_test && data.authentication.auth_test.partner_id) {\n partnerId = data.authentication.auth_test.partner_id;\n } else if (data.auth_test && data.auth_test.partner_id) {\n partnerId = data.auth_test.partner_id;\n }\n \n if (partnerId) {\n this.config.partnerId = partnerId;\n \n // Récupérer le service_id depuis la réponse\n if (data.service_id) {\n this.config.serviceId = data.service_id;\n } else {\n // Fallback: utiliser le partner_id comme service_id\n this.config.serviceId = partnerId;\n }\n \n // Utiliser le partner_id pour déterminer le nom du partenaire\n if (partnerId === 21) {\n this.config.partnerName = 'Fayma';\n } else {\n this.config.partnerName = `Partner_${partnerId}`;\n }\n \n console.log('✅ Informations partenaire récupérées:', {\n partnerName: this.config.partnerName,\n partnerId: this.config.partnerId,\n serviceId: this.config.serviceId\n });\n } else {\n console.warn('⚠️ Partner ID non trouvé dans la réponse, utilisation du partner_id par défaut');\n this.config.partnerName = `Partner_${this.config.partnerId || 'unknown'}`;\n }\n } else {\n console.warn('⚠️ Structure de réponse invalide, utilisation du partner_id par défaut');\n this.config.partnerName = `Partner_${this.config.partnerId || 'unknown'}`;\n }\n } catch (error) {\n console.warn('⚠️ Erreur lors de la récupération des informations du partenaire:', error.message);\n this.config.partnerName = 'Partner_unknown';\n }\n }\n\n /**\n * Appliquer le thème\n */\n applyTheme(theme) {\n const container = document.querySelector('.sunuid-qr-code');\n if (container) {\n container.className = `sunuid-qr-code sunuid-theme-${theme}`;\n }\n }\n\n /**\n * Gérer les erreurs\n */\n handleError(error) {\n console.error('SunuID SDK Error:', error);\n \n if (this.config.onError) {\n this.config.onError(error);\n }\n }\n\n /**\n * Vérifier le statut des connexions\n */\n async checkConnections() {\n const status = {\n api: false,\n websocket: false,\n ready: false\n };\n \n // Vérifier l'API en utilisant l'endpoint debug avec les credentials\n try {\n const testResponse = await fetch(this.config.apiUrl + '/debug', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n type: this.config.type,\n client_id: this.config.clientId,\n secret_id: this.config.secretId\n })\n });\n \n if (testResponse.ok) {\n const debugData = await testResponse.json();\n // L'API est accessible si on reçoit une réponse avec success: true\n status.api = debugData.success === true;\n console.log('🔍 API Status:', status.api ? 'accessible' : 'inaccessible');\n } else {\n status.api = false;\n console.log('🔍 API Status: HTTP', testResponse.status);\n }\n } catch (error) {\n console.log('🔍 Test API échoué:', error.message);\n status.api = false;\n }\n \n // Vérifier le WebSocket\n status.websocket = this.socket && this.socket.connected;\n \n // Connexions prêtes si API est accessible\n status.ready = status.api;\n \n return status;\n }\n \n /**\n * Attendre que les connexions soient prêtes\n */\n async waitForConnections(timeout = 5000) {\n const startTime = Date.now();\n \n while (Date.now() - startTime < timeout) {\n const status = await this.checkConnections();\n \n if (status.ready) {\n console.log('✅ Connexions prêtes');\n return status;\n }\n \n console.log('⏳ Attente connexions...', status);\n await new Promise(resolve => setTimeout(resolve, 1000)); // Vérification toutes les secondes\n }\n \n throw new Error('Timeout connexions - Impossible de générer le QR code');\n }\n \n /**\n * Obtenir l'URL du QR code généré\n */\n getQRCode() {\n // Retourner l'URL du QR code si disponible\n if (this.currentQRUrl) {\n return this.currentQRUrl;\n }\n \n // Sinon, retourner une URL par défaut ou null\n return null;\n }\n\n /**\n * Nettoyer les ressources\n */\n destroy() {\n this.stopAutoRefresh();\n \n // Fermer la connexion WebSocket\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n console.log('🌐 WebSocket déconnecté');\n }\n \n this.isInitialized = false;\n this.logSecurityEvent('SDK_DESTROY');\n console.log('SunuID SDK détruit');\n }\n\n /**\n * Arrêter le rafraîchissement automatique\n */\n stopAutoRefresh() {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n console.log('🔄 Timer de rafraîchissement arrêté');\n }\n }\n\n /**\n * Obtenir les logs de sécurité\n */\n getSecurityLogs() {\n return window.SunuIDSecurityLogs || [];\n }\n\n /**\n * Nettoyer les logs de sécurité\n */\n clearSecurityLogs() {\n window.SunuIDSecurityLogs = [];\n this.logSecurityEvent('SECURITY_LOGS_CLEARED');\n }\n\n /**\n * Afficher un loader pendant le scan du QR code\n */\n showQRLoader() {\n console.log('🔄 Affichage du loader - Scan QR initié');\n \n // Chercher le conteneur QR dans différents IDs possibles\n const containerIds = ['qr-area', 'qr-container', 'sunuid-qr-container'];\n let container = null;\n \n for (const id of containerIds) {\n container = document.getElementById(id);\n if (container) break;\n }\n \n if (!container) {\n console.warn('⚠️ Conteneur QR non trouvé pour afficher le loader');\n return;\n }\n \n // Remplacer le contenu par un loader animé\n container.innerHTML = `\n <div style=\"\n text-align: center;\n padding: 40px 20px;\n background: #f8f9fa;\n border: 2px solid #007bff;\n border-radius: 10px;\n color: #007bff;\n font-family: Arial, sans-serif;\n \">\n <div style=\"\n width: 60px;\n height: 60px;\n border: 4px solid #e3f2fd;\n border-top: 4px solid #007bff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin: 0 auto 20px auto;\n \"></div>\n <h3 style=\"margin: 0 0 10px 0; color: #007bff;\">🔍 Scan en cours...</h3>\n <p style=\"margin: 0; font-size: 14px;\">\n Veuillez patienter pendant la vérification de votre identité.\n </p>\n <div style=\"margin-top: 15px; font-size: 12px; color: #6c757d;\">\n ⏱️ Traitement en cours...\n </div>\n </div>\n <style>\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n </style>\n `;\n \n console.log('✅ Loader affiché avec succès');\n }\n\n /**\n * Extraire les données d'authentification du format WebSocket\n */\n extractAuthDataFromWebSocket(websocketData) {\n console.log('🔍 Extraction des données d\\'authentification du WebSocket:', websocketData);\n console.log('🔍 Structure complète de websocketData:', JSON.stringify(websocketData, null, 2));\n \n // Si les données sont déjà dans le bon format (callback), les retourner directement\n if (websocketData.token && websocketData.session_id) {\n console.log('✅ Données déjà au bon format (callback)');\n return websocketData;\n }\n \n // Si c'est un format WebSocket, extraire les données de responseData\n if (websocketData.responseData) {\n console.log('✅ Format WebSocket détecté, extraction de responseData');\n console.log('🔍 Contenu complet de responseData:', websocketData.responseData);\n console.log('🔍 Clés disponibles dans responseData:', Object.keys(websocketData.responseData));\n \n // Les données d'authentification sont dans responseData.data\n const responseData = websocketData.responseData;\n const authDataObj = responseData.data || responseData;\n \n console.log('🔍 Données d\\'authentification dans data:', authDataObj);\n console.log('🔍 Clés disponibles dans data:', Object.keys(authDataObj));\n \n // Debug des sous-objets qui pourraient contenir le token\n if (authDataObj.callback_data) {\n console.log('🔍 Contenu de callback_data:', authDataObj.callback_data);\n }\n if (authDataObj.session_data) {\n console.log('🔍 Contenu de session_data:', authDataObj.session_data);\n }\n if (authDataObj.user_data_sent) {\n console.log('🔍 Contenu de user_data_sent:', authDataObj.user_data_sent);\n }\n \n const authData = {\n token: (authDataObj.callback_data && authDataObj.callback_data.jwt) || // ← Priorité au JWT\n authDataObj.jwt_token ||\n authDataObj.token || \n authDataObj.auth_token ||\n (authDataObj.callback_data && authDataObj.callback_data.token) ||\n (authDataObj.session_data && authDataObj.session_data.token) ||\n (authDataObj.user_data_sent && authDataObj.user_data_sent.token),\n session_id: authDataObj.session_id || authDataObj.sessionId || authDataObj.session ||\n (authDataObj.callback_data && authDataObj.callback_data.session_id) ||\n (authDataObj.session_data && authDataObj.session_data.session_id),\n user_id: authDataObj.user_id || authDataObj.userId || authDataObj.user,\n partner_id: authDataObj.partner_id || authDataObj.partnerId || authDataObj.partner,\n type: authDataObj.type,\n timestamp: authDataObj.timestamp || responseData.timestamp || websocketData.timestamp,\n signature: authDataObj.signature || \n (authDataObj.callback_data && authDataObj.callback_data.signature),\n user_info: authDataObj.user_info || authDataObj.userInfo || authDataObj.user_data ||\n (authDataObj.user_data_sent && authDataObj.user_data_sent.user_info) ||\n (authDataObj.session_data && authDataObj.session_data.user_info),\n redirect_url: authDataObj.redirect_url || authDataObj.redirectUrl || authDataObj.redirect ||\n (authDataObj.session_data && authDataObj.session_data.redirect_url)\n };\n \n console.log('📋 Données d\\'authentification extraites:', authData);\n return authData;\n }\n \n // Si les données sont directement dans data\n if (websocketData.data) {\n console.log('✅ Format WebSocket détecté, extraction directe de data');\n console.log('🔍 Contenu complet de data:', websocketData.data);\n console.log('🔍 Clés disponibles dans data:', Object.keys(websocketData.data));\n \n const authDataObj = websocketData.data;\n \n // Debug des sous-objets qui pourraient contenir le token\n if (authDataObj.callback_data) {\n console.log('🔍 Contenu de callback_data:', authDataObj.callback_data);\n }\n if (authDataObj.session_data) {\n console.log('🔍 Contenu de session_data:', authDataObj.session_data);\n }\n if (authDataObj.user_data_sent) {\n console.log('🔍 Contenu de user_data_sent:', authDataObj.user_data_sent);\n }\n \n const authData = {\n token: (authDataObj.callback_data && authDataObj.callback_data.jwt) || // ← Priorité au JWT\n authDataObj.jwt_token ||\n authDataObj.token || \n authDataObj.auth_token ||\n (authDataObj.callback_data && authDataObj.callback_data.token) ||\n (authDataObj.session_data && authDataObj.session_data.token) ||\n (authDataObj.user_data_sent && authDataObj.user_data_sent.token),\n session_id: authDataObj.session_id || authDataObj.sessionId || authDataObj.session ||\n (authDataObj.callback_data && authDataObj.callback_data.session_id) ||\n (authDataObj.session_data && authDataObj.session_data.session_id),\n user_id: authDataObj.user_id || authDataObj.userId || authDataObj.user,\n partner_id: authDataObj.partner_id || authDataObj.partnerId || authDataObj.partner,\n type: authDataObj.type,\n timestamp: authDataObj.timestamp || websocketData.timestamp,\n signature: authDataObj.signature || \n (authDataObj.callback_data && authDataObj.callback_data.signature),\n user_info: authDataObj.user_info || authDataObj.userInfo || authDataObj.user_data ||\n (authDataObj.user_data_sent && authDataObj.user_data_sent.user_info) ||\n (authDataObj.session_data && authDataObj.session_data.user_info),\n redirect_url: authDataObj.redirect_url || authDataObj.redirectUrl || authDataObj.redirect ||\n (authDataObj.session_data && authDataObj.session_data.redirect_url)\n };\n \n console.log('📋 Données d\\'authentification extraites:', authData);\n return authData;\n }\n \n // Fallback : essayer d'extraire directement des champs principaux\n console.log('⚠️ Format non reconnu, tentative d\\'extraction directe');\n return {\n token: websocketData.token || websocketData.auth_token,\n session_id: websocketData.session_id || websocketData.sessionId,\n user_id: websocketData.user_id || websocketData.userId,\n partner_id: websocketData.partner_id || websocketData.partnerId,\n type: websocketData.type,\n timestamp: websocketData.timestamp,\n signature: websocketData.signature,\n user_info: websocketData.user_info || websocketData.userInfo,\n redirect_url: websocketData.redirect_url || websocketData.redirectUrl\n };\n }\n\n /**\n * Afficher un message de succès après authentification\n */\n showSuccessMessage(data) {\n console.log('✅ Affichage du message de succès');\n \n // Chercher le conteneur QR dans différents IDs possibles\n const containerIds = ['qr-area', 'qr-container', 'sunuid-qr-container'];\n let container = null;\n \n for (const id of containerIds) {\n container = document.getElementById(id);\n if (container) break;\n }\n \n if (!container) {\n console.warn('⚠️ Conteneur QR non trouvé pour afficher le message de succès');\n return;\n }\n \n // Extraire les informations utilisateur\n const userInfo = data.user_info || {};\n const userName = userInfo.name || userInfo.username || 'Utilisateur';\n const userEmail = userInfo.email || '';\n \n // Remplacer le contenu par un message de succès\n container.innerHTML = `\n <div style=\"\n text-align: center;\n padding: 40px 20px;\n background: #d4edda;\n border: 2px solid #28a745;\n border-radius: 10px;\n color: #155724;\n font-family: Arial, sans-serif;\n \">\n <div style=\"\n width: 60px;\n height: 60px;\n background: #28a745;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 20px auto;\n font-size: 30px;\n color: white;\n \">✅</div>\n <h3 style=\"margin: 0 0 10px 0; color: #155724;\">🎉 Authentification réussie !</h3>\n <p style=\"margin: 0 0 15px 0; font-size: 16px; font-weight: bold;\">\n Bienvenue, ${userName} !\n </p>\n ${userEmail ? `<p style=\"margin: 0 0 15px 0; font-size: 14px; color: #6c757d;\">${userEmail}</p>` : ''}\n <p style=\"margin: 0; font-size: 14px;\">\n Votre identité a été vérifiée avec succès.\n </p>\n <div style=\"margin-top: 20px; font-size: 12px; color: #6c757d;\">\n 🔄 Redirection en cours...\n </div>\n </div>\n `;\n \n console.log('✅ Message de succès affiché');\n }\n\n /**\n * Gérer le callback SunuID\n */\n handleCallback() {\n const urlParams = new URLSearchParams(window.location.search);\n \n // Vérifier si c'est un callback SunuID\n if (urlParams.has('token') && urlParams.has('session_id')) {\n console.log('🔗 Callback SunuID détecté');\n \n // Récupérer les paramètres\n const callbackData = {\n token: urlParams.get('token'),\n state: urlParams.get('state'),\n session_id: urlParams.get('session_id'),\n user_id: urlParams.get('user_id'),\n partner_id: urlParams.get('partner_id'),\n type: urlParams.get('type'),\n timestamp: urlParams.get('timestamp'),\n signature: urlParams.get('signature')\n };\n \n console.log('📋 Données callback:', callbackData);\n \n // Valider le callback\n this.validateCallback(callbackData);\n \n // Traiter l'authentification\n this.processAuthentication(callbackData);\n \n return true;\n }\n \n return false;\n }\n\n /**\n * Valider le callback\n */\n validateCallback(data) {\n console.log('🔒 Validation du callback...');\n \n // Vérifier l'état de sécurité\n if (data.state && data.state !== this.config.state) {\n console.error('❌ État de sécurité invalide');\n throw new Error('État de sécurité invalide');\n }\n \n // Vérifier la signature (si configurée)\n if (data.signature && this.config.verifySignature) {\n if (!this.verifySignature(data)) {\n console.error('❌ Signature invalide');\n throw new Error('Signature invalide');\n }\n }\n \n // Vérifier l'expiration\n if (data.timestamp && this.isExpired(data.timestamp)) {\n console.error('❌ Token expiré');\n throw new Error('Token expiré');\n }\n \n console.log('✅ Callback validé avec succès');\n }\n\n /**\n * Traiter l'authentification\n */\n processAuthentication(data) {\n console.log('🔐 Traitement de l\\'authentification...');\n \n try {\n // Décoder le JWT token\n const decodedToken = this.decodeJWT(data.token);\n \n // Vérifier les données utilisateur\n const userData = {\n user_id: decodedToken.user_id || data.user_id,\n session_id: decodedToken.session_id || data.session_id,\n partner_id: decodedToken.partner_id || data.partner_id,\n type: decodedToken.type || data.type,\n iat: decodedToken.iat,\n exp: decodedToken.exp\n };\n \n console.log('👤 Données utilisateur:', userData);\n \n // Émettre l'événement de succès\n this.emitWebSocketEvent('authentication_success', {\n userData: userData,\n callbackData: data,\n timestamp: Date.now()\n });\n \n // Appeler le callback de succès\n if (this.config.onAuthenticationSuccess) {\n this.config.onAuthenticationSuccess(userData, data);\n }\n \n // Rediriger si configuré\n if (this.config.redirectAfterSuccess) {\n this.redirectAfterSuccess(userData);\n }\n \n console.log('✅ Authentification traitée avec succès');\n \n } catch (error) {\n console.error('❌ Erreur lors du traitement:', error);\n \n // Appeler le callback d'erreur\n if (this.config.onAuthenticationError) {\n this.config.onAuthenticationError(error, data);\n }\n \n throw error;\n }\n }\n\n /**\n * Décoder un JWT token\n */\n decodeJWT(token) {\n try {\n // Décodage simple du JWT (sans vérification de signature)\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new Error('Format JWT invalide');\n }\n \n const payload = parts[1];\n const decoded = JSON.parse(atob(payload));\n \n return decoded;\n } catch (error) {\n console.error('❌ Erreur décodage JWT:', error);\n throw new Error('Token JWT invalide');\n }\n }\n\n /**\n * Vérifier la signature\n */\n verifySignature(data) {\n // Implémentation basique - à adapter selon vos besoins\n const expectedSignature = this.generateSignature(data);\n return data.signature === expectedSignature;\n }\n\n /**\n * Générer une signature\n */\n generateSignature(data) {\n // Implémentation basique - à adapter selon vos besoins\n const payload = `${data.token}.${data.state}.${data.session_id}.${data.timestamp}`;\n return btoa(payload).slice(0, 12); // Signature simplifiée\n }\n\n /**\n * Vérifier l'expiration\n */\n isExpired(timestamp) {\n const currentTime = Math.floor(Date.now() / 1000);\n const tokenTime = parseInt(timestamp);\n const maxAge = this.config.tokenMaxAge || 300; // 5 minutes par défaut\n \n return (currentTime - tokenTime) > maxAge;\n }\n\n /**\n * Rediriger après succès\n */\n redirectAfterSuccess(userData) {\n let redirectUrl = this.config.redirectAfterSuccess;\n \n // Remplacer les variables dans l'URL\n redirectUrl = redirectUrl\n .replace('{user_id}', userData.user_id)\n .replace('{session_id}', userData.session_id)\n .replace('{partner_id}', userData.partner_id)\n .replace('{type}', userData.type);\n \n console.log('🔄 Redirection vers:', redirectUrl);\n \n // Redirection avec délai pour permettre les callbacks\n setTimeout(() => {\n window.location.href = redirectUrl;\n }, 100);\n }\n\n /**\n * Générer un état de sécurité\n */\n generateState() {\n const state = 'sunuid_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n this.config.state = state;\n return state;\n }\n }\n\n // Exposer la classe globalement\n window.SunuID = SunuID;\n window.sunuidInstance = null;\n\n // Fonction d'initialisation globale\n window.initSunuID = function(config) {\n try {\n window.sunuidInstance = new SunuID(config);\n return window.sunuidInstance;\n } catch (error) {\n console.error('Erreur lors de l\\'initialisation de SunuID:', error);\n throw error;\n }\n };\n\n})(window); "],"names":["window","_window$SunuIDConfig","_window$SunuIDConfig2","_window$SunuIDConfig3","DEFAULT_CONFIG","apiUrl","SunuIDConfig","clientId","secretId","type","partnerName","theme","language","autoRefresh","refreshInterval","autoInit","onSuccess","onError","onStatusUpdate","onExpired","enableSecurityLogs","validateInputs","maxRetries","requestTimeout","secureInit","secureInitUrl","includes","replace","token","forceRemoteServer","useLocalFallback","redirectAfterSuccess","verifySignature","tokenMaxAge","onAuthenticationSuccess","onAuthenticationError","state","SunuID","_createClass","config","arguments","length","undefined","_classCallCheck","this","_objectSpread","qrCode","refreshTimer","isInitialized","socket","initPromise","console","log","key","value","_init","_asyncToGenerator","_regenerator","m","_callee","w","_context","p","n","a","_initInProgress","_doInit","f","apply","_doInit2","_callee2","_t","_context2","handleCallback","validateSecurityParams","logSecurityEvent","fetchPartnerInfo","obfuscateCredentials","slice","initWebSocket","v","error","message","_secureInit","_callee3","_result$response","_result$response2","_result$data","_result$response3","_result$data2","_result$response4","_result$data3","initData","response","result","decodedToken","_t2","_context3","fetch","method","headers","Accept","body","JSON","stringify","ok","Error","concat","status","json","success","data","decodeSecureToken","client_id","secret_id","api_url","expiresIn","expires_in","maxRequests","max_requests","requestCount","decodeBase64Any","str","s","String","atob","tokenData","parts","split","parse","exp","Number","Math","floor","Date","now","_this","io","warn","setTimeout","ip","getClientIP","randomId","random","toString","query","userId","username","transports","on","id","connected","reason","handleQRStatusUpdate","handleQRScanSuccess","handleQRExpired","showQRLoader","onAny","eventName","callback","_len","args","Array","_key","errors","push","isValidUrl","join","string","url","URL","protocol","_","event","securityLog","timestamp","toISOString","userAgent","navigator","location","href","SunuIDSecurityLogs","originalClientId","originalSecretId","clientIdDisplay","secretIdDisplay","input","trim","authData","extractAuthDataFromWebSocket","processAuthentication","showSuccessMessage","emit","_generateQR","_callee4","containerId","options","connectionStatus","socketId","qrContent","qrImageUrl","isLocal","_t3","_t4","_args4","_context4","waitForConnections","makeRequest","label","getTypeName","qrCodeUrl","startsWith","qr_url","qrUrl","image_url","imageUrl","currentQRUrl","sessionId","displayQRCode","startAutoRefresh","emitWebSocketEvent","stack","hostname","displayServiceUnavailable","_generateCustomQR","_callee5","_t5","_args5","_context5","qrcode","code","service_id","_x","_x2","_generateAuthQR","_callee6","_args6","_context6","generateQR","_x3","_generateKYCQR","_callee7","originalType","_args7","_context7","_x4","_generateSignatureQR","_callee8","_args8","_context8","_x5","_checkQRStatus","_callee9","_t6","_context9","serviceId","handleError","_x6","_generateQRWithContent","_callee0","content","localQRUrl","_t7","_args0","_context0","generateQRLocal","generateQRRemote","displayQRContent","_x7","_x8","_x9","_generateQRLocal","_callee1","_t8","_args1","_context1","encodeURIComponent","_x0","_x1","_x10","_generateQRRemote","_callee10","_t9","_args10","_context10","text","size","_x11","_x12","_x13","container","document","getElementById","typeName","innerHTML","qrElement","createElement","className","appendChild","applyTheme","_generateCustomQRCode","_callee11","qrContainer","_t0","_context11","generateQRPHP","displayDefaultQR","_x14","_x15","_generateQRClientSide","_callee12","canvas","ctx","_this2","_context12","ensureQRCodeLibrary","QRCode","width","height","getContext","fillStyle","fillRect","Promise","resolve","reject","toCanvas","margin","color","dark","light","font","textAlign","fillText","dataUrl","toDataURL","showQRInstructions","_x16","_x17","_x18","_generateQRPHP","_callee13","qrGeneratorUrl","requestBody","contentType","responseData","_context13","URLSearchParams","foreground_color","background_color","data_uri","_x19","_x20","_x21","_ensureQRCodeLibrary","_callee14","_context14","script","src","onload","onerror","head","instructionsElement","parentElement","querySelector","statusElement","style","display","classList","add","x","y","logo","Image","logoSize","logoX","logoY","drawImage","toUpperCase","_refreshQR","_callee15","_result","_t1","_args15","_context15","_x22","_this3","clearInterval","setInterval","_callee16","_t10","_context16","refreshQR","_makeRequest","_callee17","endpoint","_window$SunuIDConfig4","_window$SunuIDConfig5","sanitizedData","endpointPath","retryCount","_loop","_ret","_this4","_context18","sanitizeRequestData","endpoints","dataKeys","Object","keys","controller","timeoutId","errorText","errorData","_t11","_context17","AbortController","abort","signal","clearTimeout","e","statusText","responseKeys","name","d","_regeneratorValues","_x23","_x24","sanitized","_i","_Object$entries","entries","_Object$entries$_i","_slicedToArray","sanitizeInput","_typeof","substr","btoa","_fetchPartnerInfo","_callee18","partnerId","_t12","_context19","partner_id","authentication","auth_test","_checkConnections","_callee19","testResponse","debugData","_t13","_context20","api","websocket","ready","_waitForConnections","_callee20","timeout","startTime","_args21","_context21","checkConnections","stopAutoRefresh","disconnect","_i2","_containerIds","websocketData","session_id","authDataObj","callback_data","session_data","user_data_sent","jwt","jwt_token","auth_token","session","user_id","user","partner","signature","user_info","userInfo","user_data","redirect_url","redirectUrl","redirect","_i3","_containerIds2","userName","userEmail","email","urlParams","search","has","callbackData","get","validateCallback","isExpired","decodeJWT","userData","iat","payload","expectedSignature","generateSignature","parseInt","sunuidInstance","initSunuID"],"mappings":"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"}
1
+ {"version":3,"file":"sunuid-sdk.min.js","sources":["../src/sunuid-sdk.js"],"sourcesContent":["/**\n * SunuID SDK - Package d'intégration pour partenaires\n * \n * @version 1.0.0\n * @author SunuID Team\n * @license MIT\n */\n\n(function(window) {\n 'use strict';\n\n // Configuration par défaut\n const DEFAULT_CONFIG = {\n apiUrl: window.SunuIDConfig?.apiUrl || 'https://api.sunuid.com',\n clientId: null,\n secretId: null,\n type: 2, // Type par défaut (2 = authentification)\n partnerName: null, // Nom du partenaire récupéré depuis l'API\n theme: 'light',\n language: 'fr',\n autoRefresh: false, // Désactivé par défaut pour éviter les appels répétitifs\n refreshInterval: 30000, // 30 secondes\n autoInit: false, // Désactivé par défaut pour éviter les boucles\n onSuccess: null,\n onError: null,\n onStatusUpdate: null,\n onExpired: null,\n // Nouvelles options de sécurité\n enableSecurityLogs: true,\n validateInputs: true,\n maxRetries: 3,\n requestTimeout: 10000, // 10 secondes\n // Options d'initialisation sécurisée\n secureInit: false,\n secureInitUrl: (() => {\n if (window.SunuIDConfig?.apiUrl?.includes('api.sunuid.com')) {\n return 'https://api.sunuid.com/secure-init';\n }\n return window.SunuIDConfig?.apiUrl?.replace('/api', '') + '/secure-init' || 'https://api.sunuid.com/secure-init';\n })(),\n token: null,\n // Configuration pour forcer l'utilisation du serveur distant\n forceRemoteServer: true,\n useLocalFallback: false,\n // Nouvelles options pour les callbacks\n redirectAfterSuccess: null,\n verifySignature: false,\n tokenMaxAge: 300, // 5 minutes par défaut\n onAuthenticationSuccess: null,\n onAuthenticationError: null,\n state: null\n };\n\n /**\n * Classe principale SunuID\n */\n class SunuID {\n constructor(config = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.qrCode = null;\n this.refreshTimer = null;\n this.isInitialized = false;\n this.socket = null;\n this.initPromise = null;\n \n // DÉSACTIVÉ : Initialisation automatique pour éviter les boucles\n // L'utilisateur doit appeler init() manuellement\n console.log('🔧 SDK SunuID créé - Appelez init() manuellement');\n }\n\n /**\n * Initialisation du SDK\n */\n async init() {\n // Protection stricte contre les boucles\n if (this.isInitialized) {\n console.log('⚠️ SDK déjà initialisé, ignoré');\n return;\n }\n \n // Protection contre les initialisations simultanées\n if (this.initPromise) {\n console.log('⚠️ Initialisation déjà en cours, attente...');\n return this.initPromise;\n }\n \n // Protection contre les appels multiples rapides\n if (this._initInProgress) {\n console.log('⚠️ Initialisation en cours, ignoré');\n return;\n }\n \n this._initInProgress = true;\n this.initPromise = this._doInit();\n \n try {\n await this.initPromise;\n } finally {\n this._initInProgress = false;\n }\n \n return this.initPromise;\n }\n\n /**\n * Initialisation interne du SDK\n */\n async _doInit() {\n try {\n // Vérifier s'il y a un callback à traiter en premier\n if (this.handleCallback()) {\n console.log('✅ Callback traité, initialisation terminée');\n return;\n }\n\n // Initialisation sécurisée si activée\n if (this.config.secureInit) {\n await this.secureInit();\n } else {\n // Validation sécurisée des paramètres\n if (this.config.validateInputs) {\n this.validateSecurityParams();\n }\n }\n\n // Log de sécurité pour l'initialisation\n this.logSecurityEvent('SDK_INIT_START', {\n apiUrl: this.config.apiUrl,\n type: this.config.type,\n secureInit: this.config.secureInit\n });\n\n // Récupérer les informations du partenaire depuis l'API\n await this.fetchPartnerInfo();\n\n // Obscurcir les credentials dans les logs\n this.obfuscateCredentials();\n\n this.isInitialized = true;\n console.log('SunuID SDK initialisé avec succès');\n console.log('📋 Configuration SDK:', {\n apiUrl: this.config.apiUrl,\n type: this.config.type,\n partnerName: this.config.partnerName,\n clientId: this.config.clientId ? '***' + this.config.clientId.slice(-4) : 'null',\n secretId: this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null',\n secureInit: this.config.secureInit,\n theme: this.config.theme\n });\n \n this.logSecurityEvent('SDK_INIT_SUCCESS');\n \n // Initialiser la connexion WebSocket\n this.initWebSocket();\n \n } catch (error) {\n this.logSecurityEvent('SDK_INIT_ERROR', { error: error.message });\n throw error;\n }\n }\n\n /**\n * Initialisation sécurisée via endpoint serveur\n */\n async secureInit() {\n try {\n this.logSecurityEvent('SECURE_INIT_START');\n \n const initData = {\n type: this.config.type,\n partnerName: this.config.partnerName,\n theme: this.config.theme\n };\n\n const response = await fetch(this.config.secureInitUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify(initData)\n });\n\n if (!response.ok) {\n throw new Error(`Erreur HTTP: ${response.status}`);\n }\n\n const result = await response.json();\n \n console.log('📋 Réponse initialisation sécurisée:', result);\n \n if (!result.success) {\n throw new Error(result.error || 'Erreur lors de l\\'initialisation sécurisée');\n }\n\n // Extraire le token depuis différents chemins possibles\n const token = (result?.response?.response?.token)\n || (result?.response?.token)\n || (result?.data?.token)\n || (result?.token);\n\n if (!token || typeof token !== 'string') {\n throw new Error('Token non trouvé dans la réponse');\n }\n\n // Stocker le token\n this.config.token = token;\n\n // Décoder le token pour récupérer les credentials\n const decodedToken = this.decodeSecureToken(token);\n if (decodedToken) {\n const clientId = decodedToken.clientId || decodedToken.client_id;\n const secretId = decodedToken.secretId || decodedToken.secret_id;\n const apiUrl = decodedToken.apiUrl || decodedToken.api_url;\n\n if (clientId) this.config.clientId = clientId;\n if (secretId) this.config.secretId = secretId;\n if (apiUrl) this.config.apiUrl = apiUrl;\n } else {\n throw new Error('Impossible de décoder le token sécurisé');\n }\n\n // Récupérer expiration et limites depuis la réponse si présentes\n this.config.expiresIn = (result?.response?.expires_in)\n || (result?.data?.expires_in)\n || (result?.expires_in)\n || this.config.expiresIn;\n\n this.config.maxRequests = (result?.response?.max_requests)\n || (result?.data?.max_requests)\n || (result?.max_requests)\n || this.config.maxRequests;\n\n this.config.requestCount = 0;\n\n this.logSecurityEvent('SECURE_INIT_SUCCESS', {\n expiresIn: this.config.expiresIn,\n maxRequests: this.config.maxRequests\n });\n\n console.log('✅ Initialisation sécurisée réussie');\n \n } catch (error) {\n this.logSecurityEvent('SECURE_INIT_ERROR', { error: error.message });\n throw new Error(`Échec de l'initialisation sécurisée: ${error.message}`);\n }\n }\n\n /**\n * Décoder le token sécurisé\n */\n decodeSecureToken(token) {\n try {\n if (!token || typeof token !== 'string') return null;\n\n // Helper: décodage base64/base64url avec padding\n const decodeBase64Any = (str) => {\n let s = String(str).replace(/-/g, '+').replace(/_/g, '/');\n while (s.length % 4 !== 0) s += '=';\n return atob(s);\n };\n\n let tokenData = null;\n\n if (token.includes('.')) {\n // JWT-like: header.payload.signature ou header.payload\n const parts = token.split('.');\n const payloadPart = parts.length >= 2 ? parts[1] : parts[0];\n const json = decodeBase64Any(payloadPart);\n tokenData = JSON.parse(json);\n } else {\n // Base64(\"{json}\") simple\n const json = decodeBase64Any(token);\n tokenData = JSON.parse(json);\n }\n\n // Vérifier l'expiration (en secondes)\n if (tokenData && tokenData.exp && Number(tokenData.exp) < Math.floor(Date.now() / 1000)) {\n console.error('❌ Token expiré');\n return null;\n }\n\n console.log('✅ Token décodé avec succès');\n return tokenData;\n\n } catch (error) {\n console.error('❌ Erreur décodage token:', error);\n return null;\n }\n }\n\n /**\n * Initialiser la connexion WebSocket\n */\n initWebSocket() {\n try {\n // Vérifier si Socket.IO est disponible\n if (typeof io === 'undefined') {\n console.warn('⚠️ Socket.IO non disponible, WebSocket sera initialisé plus tard');\n // Réessayer après un délai\n setTimeout(() => this.initWebSocket(), 1000);\n return;\n }\n \n // Obtenir l'IP du client (simulation)\n const ip = this.getClientIP();\n \n // Initialiser la connexion WebSocket si elle n'existe pas\n if (!this.socket) {\n console.log('🌐 Initialisation Socket.IO...');\n \n // Générer un identifiant aléatoire pour la session WebSocket\n const randomId = 'web_' + Math.random().toString(36).slice(2) + '_' + Date.now();\n this.socket = io('wss://socket.sunuid.com:9446', {\n query: {\n token: randomId,\n type: 'web',\n userId: randomId,\n username: ip\n },\n transports: ['websocket', 'polling']\n });\n\n // Gestion des événements WebSocket\n this.socket.on('connect', () => {\n console.log('🌐 WebSocket connecté avec succès');\n console.log('📊 Socket ID:', this.socket.id);\n this.socket.connected = true;\n });\n\n this.socket.on('disconnect', (reason) => {\n console.log('❌ WebSocket déconnecté:', reason);\n this.socket.connected = false;\n });\n\n this.socket.on('connect_error', (error) => {\n console.error('❌ Erreur connexion WebSocket:', error);\n this.socket.connected = false;\n });\n\n // Écouter les événements spécifiques\n this.socket.on('qr_status_update', (data) => {\n console.log('📱 Mise à jour statut QR reçue:', data);\n this.handleQRStatusUpdate(data);\n });\n\n this.socket.on('qr_scan_success', (data) => {\n console.log('✅ Scan QR réussi reçu:', data);\n this.handleQRScanSuccess(data);\n });\n\n this.socket.on('qr_expired', (data) => {\n console.log('⏰ QR expiré reçu:', data);\n this.handleQRExpired(data);\n });\n\n // Écouter l'événement qr_scan_initiated spécifiquement\n this.socket.on('qr_scan_initiated', (data) => {\n console.log('🔍 QR Scan Initiated reçu:', data);\n this.showQRLoader();\n });\n\n // Écouter l'événement message générique (fallback)\n this.socket.on('message', (data) => {\n console.log('📨 Message socket reçu:', data);\n if (data && data.type === 'qr_scan_initiated') {\n console.log('🔍 QR Scan Initiated détecté dans message:', data);\n this.showQRLoader();\n }\n });\n\n // Écouter tous les événements socket pour le debugging\n this.socket.onAny = this.socket.onAny || function(eventName, callback) {\n // Fallback pour les versions de Socket.IO qui n'ont pas onAny\n console.log(`🌐 Socket Event [${eventName}]:`, callback);\n };\n \n // Logger tous les événements reçus\n this.socket.onAny((eventName, ...args) => {\n console.log(`🌐 Socket Event [${eventName}]:`, args);\n });\n } else {\n console.log('🌐 WebSocket déjà connecté');\n }\n } catch (error) {\n console.error('❌ Erreur initialisation WebSocket:', error);\n }\n }\n\n /**\n * Obtenir l'IP du client (simulation)\n */\n getClientIP() {\n // Simulation - en production, vous pourriez utiliser un service d'IP\n return '127.0.0.1';\n }\n\n /**\n * Obtenir le nom du type à partir du numéro\n */\n getTypeName(type) {\n switch(type) {\n case 1: return 'KYC';\n case 2: return 'AUTH';\n case 3: return 'SIGNATURE';\n default: return `TYPE-${type}`;\n }\n }\n\n /**\n * Validation sécurisée des paramètres\n */\n validateSecurityParams() {\n const errors = [];\n \n // Validation du clientId\n if (!this.config.clientId || typeof this.config.clientId !== 'string') {\n errors.push('clientId invalide ou manquant');\n } else if (this.config.clientId.length < 10) {\n errors.push('clientId trop court');\n }\n \n // Validation du secretId\n if (!this.config.secretId || typeof this.config.secretId !== 'string') {\n errors.push('secretId invalide ou manquant');\n } else if (this.config.secretId.length < 32) {\n errors.push('secretId trop court (minimum 32 caractères)');\n }\n \n // Validation de l'URL API\n if (!this.config.apiUrl || !this.isValidUrl(this.config.apiUrl)) {\n errors.push('apiUrl invalide');\n }\n \n // Validation du type\n if (![1, 2, 3].includes(this.config.type)) {\n errors.push('type invalide (doit être 1, 2 ou 3)');\n }\n \n if (errors.length > 0) {\n this.logSecurityEvent('VALIDATION_ERROR', { errors });\n throw new Error(`Paramètres de sécurité invalides: ${errors.join(', ')}`);\n }\n \n this.logSecurityEvent('VALIDATION_SUCCESS');\n }\n\n /**\n * Validation d'URL sécurisée\n */\n isValidUrl(string) {\n try {\n const url = new URL(string);\n return url.protocol === 'https:' || url.protocol === 'http:';\n } catch (_) {\n return false;\n }\n }\n\n /**\n * Logs de sécurité\n */\n logSecurityEvent(event, data = {}) {\n if (!this.config.enableSecurityLogs) return;\n \n const securityLog = {\n timestamp: new Date().toISOString(),\n event: event,\n data: data,\n userAgent: navigator.userAgent,\n url: window.location.href\n };\n \n console.warn('🔒 [SECURITY]', securityLog);\n \n // Stocker les logs de sécurité (optionnel)\n if (!window.SunuIDSecurityLogs) {\n window.SunuIDSecurityLogs = [];\n }\n window.SunuIDSecurityLogs.push(securityLog);\n }\n\n /**\n * Chiffrement simple des credentials (pour éviter l'exposition en clair)\n */\n obfuscateCredentials() {\n // Stocker les vraies valeurs pour les logs de sécurité\n this.config.originalClientId = this.config.clientId;\n this.config.originalSecretId = this.config.secretId;\n \n // Créer des versions obfusquées pour l'affichage uniquement\n if (this.config.clientId) {\n this.config.clientIdDisplay = this.config.clientId.replace(/(.{3}).*(.{3})/, '$1***$2');\n }\n if (this.config.secretId) {\n this.config.secretIdDisplay = this.config.secretId.replace(/(.{4}).*(.{4})/, '$1***$2');\n }\n }\n\n /**\n * Validation des entrées utilisateur\n */\n sanitizeInput(input) {\n if (typeof input !== 'string') return input;\n \n // Protection contre les injections XSS basiques\n return input\n .replace(/[<>]/g, '') // Supprimer les balises HTML\n .replace(/javascript:/gi, '') // Supprimer les protocoles dangereux\n .trim();\n }\n\n /**\n * Gérer la mise à jour du statut QR\n */\n handleQRStatusUpdate(data) {\n console.log('📱 QR Status Update:', data);\n if (this.config.onStatusUpdate) {\n this.config.onStatusUpdate(data);\n }\n }\n\n /**\n * Gérer le succès du scan QR\n */\n handleQRScanSuccess(data) {\n console.log('✅ QR Scan Success reçu:', data);\n \n try {\n // Extraire les données d'authentification du format WebSocket\n const authData = this.extractAuthDataFromWebSocket(data);\n \n // Traiter l'authentification comme un callback\n this.processAuthentication(authData);\n \n // Afficher un message de succès\n this.showSuccessMessage(authData);\n \n // Appeler le callback de succès (pour compatibilité)\n if (this.config.onSuccess) {\n this.config.onSuccess(authData);\n }\n \n console.log('✅ Authentification WebSocket traitée avec succès');\n \n } catch (error) {\n console.error('❌ Erreur lors du traitement WebSocket:', error);\n \n // Appeler le callback d'erreur\n if (this.config.onAuthenticationError) {\n this.config.onAuthenticationError(error, data);\n }\n }\n }\n\n /**\n * Gérer l'expiration du QR\n */\n handleQRExpired(data) {\n console.log('⏰ QR Expired:', data);\n if (this.config.onExpired) {\n this.config.onExpired(data);\n }\n }\n\n /**\n * Émettre un événement WebSocket\n */\n emitWebSocketEvent(event, data) {\n if (this.socket && this.socket.connected) {\n this.socket.emit(event, data);\n console.log(`📤 Événement WebSocket émis: ${event}`, data);\n } else {\n console.warn('⚠️ WebSocket non connecté, impossible d\\'émettre l\\'événement:', event);\n }\n }\n\n /**\n * Obtenir le statut de la connexion WebSocket\n */\n getWebSocketStatus() {\n if (!this.socket) {\n return 'not_initialized';\n }\n return this.socket.connected ? 'connected' : 'disconnected';\n }\n\n /**\n * Forcer l'initialisation WebSocket (si Socket.IO devient disponible plus tard)\n */\n forceWebSocketInit() {\n if (typeof io !== 'undefined' && !this.socket) {\n console.log('🔄 Forçage de l\\'initialisation WebSocket...');\n this.initWebSocket();\n }\n }\n\n /**\n * Générer un QR code avec le type configuré\n */\n async generateQR(containerId = 'sunuid-qr-container', options = {}) {\n // Attendre l'initialisation si nécessaire\n if (this.initPromise) {\n await this.initPromise;\n this.initPromise = null;\n }\n \n if (!this.isInitialized) {\n throw new Error('SunuID: SDK non initialisé');\n }\n \n console.log('🎯 generateQR appelé avec containerId:', containerId);\n \n // Attendre que les connexions soient prêtes\n console.log('🔍 Attente connexions API et WebSocket...');\n try {\n const connectionStatus = await this.waitForConnections(5000); // 5 secondes max\n console.log('✅ Connexions prêtes:', connectionStatus);\n } catch (connectionError) {\n console.error('❌ Erreur connexions:', connectionError.message);\n throw new Error('Connexions non disponibles - Impossible de générer le QR code');\n }\n\n try {\n // Utiliser uniquement le socketID comme contenu du QR\n const socketId = this.socket ? this.socket.id : 'timeout-socket-id';\n const qrContent = socketId;\n \n console.log('📄 Contenu QR préparé:', qrContent);\n console.log('🔌 Socket ID:', socketId);\n \n // Générer le QR avec le contenu complet\n const partnerName = this.config.partnerName || 'Partner_unknown';\n const response = await this.makeRequest('/qr-generate', {\n type: this.config.type,\n data: qrContent, // Essayer data au lieu de content\n label: `${this.getTypeName(this.config.type)} ${partnerName}`, // Label du QR avec nom du partenaire\n ...options\n });\n\n if (response.success) {\n // Debug: Afficher la structure complète de la réponse\n console.log('📋 Réponse QR API complète:', response);\n console.log('📋 Structure response.data:', response.data);\n \n // Construire l'URL complète du QR code\n let qrImageUrl = response.data.qrCodeUrl;\n \n // Si l'URL est relative, la rendre absolue\n if (qrImageUrl && qrImageUrl.startsWith('/')) {\n qrImageUrl = `${this.config.apiUrl}${qrImageUrl}`;\n }\n \n // Vérifier si l'URL du QR code existe\n if (!qrImageUrl) {\n console.warn('⚠️ qrCodeUrl non trouvé dans la réponse, recherche d\\'alternatives...');\n \n // Essayer d'autres champs possibles\n qrImageUrl = response.data.qr_url || \n response.data.qrUrl || \n response.data.url || \n response.data.image_url ||\n response.data.imageUrl;\n \n if (qrImageUrl) {\n console.log('✅ URL QR trouvée dans un champ alternatif:', qrImageUrl);\n } else {\n console.error('❌ Aucune URL QR trouvée dans la réponse');\n throw new Error('URL du QR code non trouvée dans la réponse API');\n }\n }\n \n this.currentQRUrl = qrImageUrl;\n \n console.log('✅ QR code généré par API principale:', qrImageUrl);\n console.log('📄 Contenu QR final:', qrContent);\n console.log('🏷️ Label QR:', response.data.label || 'N/A');\n console.log('🆔 Session ID:', response.data.sessionId || 'N/A');\n \n // Afficher le QR code\n this.displayQRCode(containerId, qrImageUrl, this.config.type, options);\n \n this.startAutoRefresh(containerId, this.config.type, options);\n \n // Émettre un événement WebSocket pour la génération du QR\n this.emitWebSocketEvent('qr_generated', {\n type: this.config.type,\n qrCodeUrl: qrImageUrl,\n socketId: socketId,\n qrContent: qrContent,\n label: response.data.label,\n sessionId: response.data.sessionId,\n timestamp: Date.now()\n });\n \n return {\n ...response.data,\n qrCodeUrl: qrImageUrl,\n qrContent: qrContent,\n label: response.data.label,\n sessionId: response.data.sessionId\n };\n } else {\n throw new Error(response.message || 'Erreur lors de la génération du QR code');\n }\n } catch (error) {\n console.error('Erreur API détectée:', error.message);\n console.error('Stack trace complet:', error.stack);\n console.error('Configuration SDK:', {\n apiUrl: this.config.apiUrl,\n type: this.config.type,\n secureInit: this.config.secureInit,\n clientId: this.config.clientId ? '***' + this.config.clientId.slice(-4) : 'null',\n secretId: this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null'\n });\n \n // Fallback vers le service local seulement si activé\n if (this.config.useLocalFallback) {\n console.log('🔍 Vérification fallback local...');\n console.log('🔍 Hostname:', window.location.hostname);\n console.log('🔍 Protocol:', window.location.protocol);\n console.log('🔍 URL complète:', window.location.href);\n \n const isLocal = window.location.hostname === 'localhost' || \n window.location.hostname === '127.0.0.1' || \n window.location.protocol === 'file:';\n \n console.log('🔍 Est local:', isLocal);\n \n if (isLocal) {\n console.log('🔄 Tentative fallback vers service QR local...');\n console.log('❌ Fallback local non implémenté - utilisation serveur distant uniquement');\n } else {\n console.log('❌ Pas en local, pas de fallback');\n }\n } else {\n console.log('🔒 Fallback local désactivé, utilisation serveur distant uniquement');\n }\n \n console.log('Affichage du message \"Service non disponible\" pour type ' + this.config.type);\n this.displayServiceUnavailable(containerId, this.config.type);\n throw new Error('Service non disponible');\n }\n }\n\n\n\n /**\n * Générer un QR code avec un type personnalisé\n */\n async generateCustomQR(containerId, type, options = {}) {\n // Attendre l'initialisation si nécessaire\n if (this.initPromise) {\n await this.initPromise;\n this.initPromise = null;\n }\n \n if (!this.isInitialized) {\n throw new Error('SunuID: SDK non initialisé');\n }\n\n try {\n const response = await this.makeRequest('/qr-generate', {\n type: type, // Type personnalisé (1, 2, 3, etc.)\n ...options\n });\n\n if (response.success) {\n // Construire l'URL complète de l'image QR avec la base URL pour les images\n const imageBaseUrl = 'https://sunuid.fayma.sn';\n const qrImageUrl = `${imageBaseUrl}${response.data.qrcode}`;\n this.displayQRCode(containerId, qrImageUrl, type, options);\n \n // Le QR code est déjà généré par l'API principale\n console.log('✅ QR code personnalisé généré par API principale:', qrImageUrl);\n console.log('📄 Code de session:', response.data.code);\n console.log('🆔 Service ID:', response.data.service_id);\n \n this.startAutoRefresh(containerId, type, options);\n return {\n ...response.data,\n qrCodeUrl: qrImageUrl,\n sessionId: response.data.service_id\n };\n } else {\n throw new Error(response.message || 'Erreur lors de la génération du QR code');\n }\n } catch (error) {\n console.error('Erreur API détectée:', error.message);\n console.error('Stack trace complet:', error.stack);\n console.error('Configuration SDK (Custom):', {\n apiUrl: this.config.apiUrl,\n type: type,\n secureInit: this.config.secureInit,\n clientId: this.config.clientId ? '***' + this.config.clientId.slice(-4) : 'null',\n secretId: this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null'\n });\n console.log('Affichage du message \"Service non disponible\" pour type ' + type);\n this.displayServiceUnavailable(containerId, type);\n throw new Error('Service non disponible');\n }\n }\n\n // Alias pour maintenir la compatibilité\n async generateAuthQR(containerId, options = {}) {\n return this.generateQR(containerId, options);\n }\n\n async generateKYCQR(containerId, options = {}) {\n // Sauvegarder le type actuel\n const originalType = this.config.type;\n // Changer temporairement le type pour KYC\n this.config.type = 1;\n try {\n return await this.generateQR(containerId, options);\n } finally {\n // Restaurer le type original\n this.config.type = originalType;\n }\n }\n\n async generateSignatureQR(containerId, options = {}) {\n // Sauvegarder le type actuel\n const originalType = this.config.type;\n // Changer temporairement le type pour Signature\n this.config.type = 3;\n try {\n return await this.generateQR(containerId, options);\n } finally {\n // Restaurer le type original\n this.config.type = originalType;\n }\n }\n\n /**\n * Vérifier le statut d'un QR code\n */\n async checkQRStatus(sessionId) {\n if (!this.isInitialized) {\n throw new Error('SunuID: SDK non initialisé');\n }\n\n try {\n const response = await this.makeRequest('/qr-status', {\n serviceId: sessionId\n });\n\n if (response.success) {\n return response.data;\n } else {\n throw new Error(response.message || 'Erreur lors de la vérification du statut');\n }\n } catch (error) {\n this.handleError(error);\n throw error;\n }\n }\n\n /**\n * Générer un QR code avec un contenu spécifique\n */\n async generateQRWithContent(content, containerId, type, options = {}) {\n console.log('🎨 Génération QR avec contenu:', content);\n \n try {\n // Essayer d'abord le service QR local\n if (window.location.hostname === 'localhost' || \n window.location.hostname === '127.0.0.1' || \n window.location.protocol === 'file:') {\n \n console.log('🏠 Utilisation service QR local...');\n const localQRUrl = await this.generateQRLocal(content, containerId, type, options);\n if (localQRUrl) {\n return localQRUrl;\n }\n }\n \n // Fallback vers le service QR distant\n console.log('🌐 Utilisation service QR distant...');\n return await this.generateQRRemote(content, containerId, type, options);\n \n } catch (error) {\n console.error('❌ Erreur génération QR:', error);\n // Fallback vers affichage simple du contenu\n this.displayQRContent(containerId, content, type, options);\n return null;\n }\n }\n \n /**\n * Générer QR code avec service local\n */\n async generateQRLocal(content, containerId, type, options = {}) {\n try {\n const response = await fetch('http://localhost:8000/api/generate/text', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: `text=${encodeURIComponent(content)}&size=300`\n });\n \n if (response.ok) {\n const data = await response.json();\n const qrUrl = `data:image/png;base64,${data.qrcode}`;\n this.displayQRCode(containerId, qrUrl, type, options);\n return qrUrl;\n }\n } catch (error) {\n console.log('❌ Service QR local non disponible:', error.message);\n }\n return null;\n }\n \n /**\n * Générer QR code avec service distant\n */\n async generateQRRemote(content, containerId, type, options = {}) {\n try {\n const response = await fetch('https://api.sunuid.com/qr-generate', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n text: content,\n size: 300,\n type: type\n })\n });\n \n if (response.ok) {\n const data = await response.json();\n const qrUrl = `data:image/png;base64,${data.qrcode}`;\n this.displayQRCode(containerId, qrUrl, type, options);\n return qrUrl;\n }\n } catch (error) {\n console.error('❌ Erreur service QR distant:', error);\n }\n \n // Fallback vers affichage du contenu\n this.displayQRContent(containerId, content, type, options);\n return null;\n }\n \n /**\n * Afficher le contenu QR en texte (fallback)\n */\n displayQRContent(containerId, content, type, options = {}) {\n const container = document.getElementById(containerId);\n if (!container) {\n throw new Error(`Conteneur avec l'ID \"${containerId}\" non trouvé`);\n }\n\n const typeName = this.getTypeName(type);\n container.innerHTML = `\n <div class=\"sunuid-qr-code\">\n <div class=\"sunuid-qr-header\">\n <h3>${typeName}</h3>\n </div>\n <div class=\"sunuid-qr-content\" style=\"text-align: center; padding: 20px; background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 5px; margin: 10px 0;\">\n <p><strong>Contenu QR Code:</strong></p>\n <p style=\"font-family: monospace; font-size: 14px; word-break: break-all;\">${content}</p>\n </div>\n <div class=\"sunuid-qr-instructions\">\n <p>Contenu QR généré avec le format: {type}-{code}-{socketid}</p>\n </div>\n </div>\n `;\n \n console.log('✅ Contenu QR affiché:', content);\n }\n \n /**\n * Afficher un QR code dans un conteneur\n */\n displayQRCode(containerId, qrUrl, type, options = {}) {\n const container = document.getElementById(containerId);\n if (!container) {\n throw new Error(`Conteneur avec l'ID \"${containerId}\" non trouvé`);\n }\n\n // Nettoyer le conteneur\n container.innerHTML = '';\n\n // Créer l'élément QR code\n const qrElement = document.createElement('div');\n qrElement.className = 'sunuid-qr-code';\n \n // Afficher l'image QR avec les informations\n const typeName = this.getTypeName(type);\n qrElement.innerHTML = `\n <div class=\"sunuid-qr-header\">\n <h3>${type === 1 ? 'Vérification KYC' : type === 2 ? 'Authentification' : type === 3 ? 'Signature' : 'Service Type ' + type}</h3>\n </div>\n <div class=\"sunuid-qr-image\">\n <img src=\"${qrUrl}\" alt=\"QR Code ${typeName}\" style=\"max-width: 300px; border: 1px solid #ddd; border-radius: 5px;\" />\n </div>\n \n `;\n\n container.appendChild(qrElement);\n\n // Appliquer le thème\n this.applyTheme(options.theme || this.config.theme);\n \n console.log('✅ QR code affiché:', qrUrl);\n }\n\n /**\n * Générer un QR code personnalisé avec bibliothèque locale\n */\n async generateCustomQRCode(content, label, options = {}) {\n console.log('🎨 Début génération QR personnalisé...');\n console.log('📄 Contenu:', content);\n console.log('🏷️ Label:', label);\n \n // Chercher le conteneur QR\n let qrContainer = document.getElementById('sunuid-qr-container');\n if (!qrContainer) {\n qrContainer = document.getElementById('qr-container');\n }\n if (!qrContainer) {\n console.error('❌ QR container not found');\n return;\n }\n \n console.log('✅ QR container trouvé');\n\n // Nettoyer le conteneur\n qrContainer.innerHTML = '<div style=\"text-align: center; padding: 20px;\"><p>Génération QR code...</p></div>';\n\n try {\n // Utiliser directement l'API principale (plus fiable)\n console.log('🎨 Tentative génération via API principale...');\n await this.generateQRPHP(content, label, qrContainer);\n console.log('✅ QR code généré avec succès');\n \n } catch (error) {\n console.error('❌ Erreur génération API:', error);\n \n // Fallback final : image par défaut\n console.log('⚠️ Affichage image par défaut');\n this.displayDefaultQR(qrContainer, content, label);\n }\n }\n\n /**\n * Générer un QR code côté client (méthode principale)\n */\n async generateQRClientSide(content, label, qrContainer) {\n // Charger QRCode si nécessaire\n await this.ensureQRCodeLibrary();\n \n if (typeof QRCode === 'undefined') {\n throw new Error('QRCode library non disponible');\n }\n \n // Créer un canvas\n const canvas = document.createElement('canvas');\n canvas.width = 300;\n canvas.height = 320;\n const ctx = canvas.getContext('2d');\n \n // Fond blanc\n ctx.fillStyle = '#FFFFFF';\n ctx.fillRect(0, 0, 300, 320);\n \n // Générer le QR code\n return new Promise((resolve, reject) => {\n QRCode.toCanvas(canvas, content, {\n width: 280,\n margin: 10,\n color: {\n dark: '#000000',\n light: '#FFFFFF'\n }\n }, (error) => {\n if (error) {\n reject(error);\n return;\n }\n \n // Ajouter le label\n ctx.fillStyle = '#333333';\n ctx.font = 'bold 14px Arial';\n ctx.textAlign = 'center';\n ctx.fillText(label, 150, 305);\n \n // Convertir en data URL\n const dataUrl = canvas.toDataURL('image/png');\n \n // Stocker l'URL\n this.currentQRUrl = dataUrl;\n \n // Afficher le QR code\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px;\">\n <img src=\"${dataUrl}\" alt=\"QR Code\" style=\"max-width: 300px; border: 2px solid #ddd; border-radius: 10px;\">\n </div>\n `;\n \n // Afficher les instructions\n this.showQRInstructions(qrContainer);\n \n resolve();\n });\n });\n }\n\n /**\n * Générer un QR code via endpoint serveur (fallback)\n */\n async generateQRPHP(content, label, qrContainer) {\n // Construire l'URL - Utiliser l'API principale qui fonctionne\n let qrGeneratorUrl;\n if (this.config.forceRemoteServer) {\n qrGeneratorUrl = 'https://api.sunuid.com/qr-generate';\n } else if (this.config.apiUrl.includes('api.sunuid.com')) {\n qrGeneratorUrl = 'https://api.sunuid.com/qr-generate';\n } else if (this.config.apiUrl.includes('localhost') || this.config.apiUrl.includes('127.0.0.1')) {\n qrGeneratorUrl = 'http://localhost:8000/api/generate/text';\n } else {\n qrGeneratorUrl = this.config.apiUrl + '/qr-generate';\n }\n \n console.log('🔗 URL QR Generator:', qrGeneratorUrl);\n \n // Adapter le format selon l'URL\n let requestBody;\n let contentType;\n \n if (qrGeneratorUrl.includes('localhost:8000')) {\n // Service local - format form-data\n contentType = 'application/x-www-form-urlencoded';\n requestBody = new URLSearchParams({\n text: content,\n size: 300,\n margin: 10,\n foreground_color: '000000',\n background_color: 'FFFFFF'\n });\n } else {\n // Service distant - format JSON avec les paramètres de l'API principale\n contentType = 'application/json';\n requestBody = JSON.stringify({\n type: this.config.type,\n client_id: this.config.clientId,\n secret_id: this.config.secretId,\n content: content,\n label: label\n });\n }\n \n const response = await fetch(qrGeneratorUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': contentType,\n 'Accept': 'application/json'\n },\n body: requestBody\n });\n \n if (!response.ok) {\n throw new Error(`Erreur HTTP: ${response.status}`);\n }\n \n const responseData = await response.json();\n \n if (!responseData.success) {\n throw new Error(`Erreur QR: ${responseData.error}`);\n }\n \n // Adapter selon le format de réponse\n let qrImageUrl;\n if (qrGeneratorUrl.includes('localhost:8000')) {\n // Service local\n qrImageUrl = responseData.data_uri;\n } else {\n // Service distant - utiliser le format de l'API principale\n const imageBaseUrl = 'https://sunuid.fayma.sn';\n qrImageUrl = `${imageBaseUrl}${responseData.data.qrcode}`;\n }\n \n // Stocker l'URL\n this.currentQRUrl = qrImageUrl;\n \n // Afficher le QR code\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px;\">\n <img src=\"${qrImageUrl}\" alt=\"QR Code\" style=\"max-width: 300px; border: 2px solid #ddd; border-radius: 10px;\">\n </div>\n `;\n \n // Afficher les instructions\n this.showQRInstructions(qrContainer);\n }\n\n /**\n * Afficher une image QR par défaut (fallback final)\n */\n displayDefaultQR(qrContainer, content, label) {\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px; color: #666;\">\n <div style=\"width: 300px; height: 300px; background: #f0f0f0; border: 2px solid #ddd; border-radius: 10px; display: flex; align-items: center; justify-content: center; margin: 0 auto;\">\n <div>\n <p style=\"font-size: 24px; margin: 0;\">📱</p>\n <p style=\"font-size: 14px; margin: 10px 0 0 0;\">QR Code</p>\n </div>\n </div>\n <p style=\"margin-top: 10px; font-size: 12px;\">${label}</p>\n <p style=\"font-size: 10px; color: #999; margin-top: 5px;\">Contenu: ${content}</p>\n </div>\n `;\n }\n\n /**\n * S'assurer que la bibliothèque QRCode est disponible\n */\n async ensureQRCodeLibrary() {\n if (typeof QRCode !== 'undefined') {\n console.log('✅ QRCode library déjà disponible');\n return true;\n }\n \n console.log('📦 Chargement QRCode library...');\n \n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://cdn.jsdelivr.net/npm/qrcode@1.5.3/lib/browser.min.js';\n script.onload = () => {\n setTimeout(() => {\n if (typeof QRCode !== 'undefined') {\n console.log('✅ QRCode library chargée');\n resolve(true);\n } else {\n console.error('❌ QRCode non disponible après chargement');\n reject(new Error('QRCode library non disponible après chargement'));\n }\n }, 200);\n };\n script.onerror = () => {\n console.error('❌ Erreur chargement QRCode library');\n reject(new Error('Erreur chargement QRCode library'));\n };\n document.head.appendChild(script);\n });\n }\n\n /**\n * Afficher les instructions pour le QR code\n */\n showQRInstructions(qrContainer) {\n const instructionsElement = qrContainer.parentElement.querySelector('.sunuid-qr-instructions');\n const statusElement = qrContainer.parentElement.querySelector('.sunuid-qr-status');\n \n if (instructionsElement) {\n instructionsElement.style.display = 'block';\n instructionsElement.classList.add('sunuid-qr-ready');\n }\n if (statusElement) {\n statusElement.style.display = 'block';\n statusElement.classList.add('sunuid-qr-ready');\n }\n }\n\n /**\n * Ajouter le logo au centre du QR code\n */\n addLogoToCenter(ctx, x, y, width, height) {\n try {\n // Créer une image pour le logo\n const logo = new Image();\n logo.onload = () => {\n const logoSize = 40;\n const logoX = x + (width - logoSize) / 2;\n const logoY = y + (width - logoSize) / 2;\n\n // Dessiner un fond blanc pour le logo\n ctx.fillStyle = 'white';\n ctx.fillRect(logoX - 2, logoY - 2, logoSize + 4, logoSize + 4);\n\n // Dessiner le logo\n ctx.drawImage(logo, logoX, logoY, logoSize, logoSize);\n };\n logo.src = 'src/logoqr.png';\n } catch (error) {\n console.warn('Logo non disponible:', error);\n }\n }\n\n /**\n * Afficher l'image de fallback\n */\n displayFallbackImage() {\n console.log('⚠️ Affichage de l\\'image de fallback');\n const qrContainer = document.getElementById('sunuid-qr-container');\n if (qrContainer) {\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px; color: #666;\">\n <p>⚠️ Génération QR personnalisé non disponible</p>\n <p>Utilisation de l'image par défaut</p>\n <p><strong>Debug:</strong> QRCode disponible: ${typeof QRCode !== 'undefined'}</p>\n <p><strong>Debug:</strong> Container trouvé: ${qrContainer !== null}</p>\n </div>\n `;\n }\n }\n\n /**\n * Afficher \"Service non disponible\"\n */\n displayServiceUnavailable(containerId, type) {\n console.log(`displayServiceUnavailable appelée pour ${containerId}, type: ${type}`);\n const container = document.getElementById(containerId);\n if (!container) {\n console.error(`Container ${containerId} non trouvé`);\n return;\n }\n\n container.innerHTML = `\n <div class=\"sunuid-service-unavailable\" style=\"\n text-align: center;\n padding: 40px 20px;\n background: #f8f9fa;\n border: 2px dashed #dee2e6;\n border-radius: 10px;\n color: #6c757d;\n font-family: Arial, sans-serif;\n \">\n <div style=\"font-size: 48px; margin-bottom: 20px;\">⚠️</div>\n <h3 style=\"margin: 0 0 10px 0; color: #495057;\">Service Non Disponible</h3>\n <p style=\"margin: 0; font-size: 14px;\">\n Le service d'authentification est temporairement indisponible.<br>\n Veuillez réessayer plus tard.\n </p>\n <div style=\"margin-top: 20px; font-size: 12px; color: #adb5bd;\">\n Type: ${String(type).toUpperCase()}\n </div>\n </div>\n `;\n }\n\n /**\n * Rafraîchir un QR code\n */\n async refreshQR(containerId, options = {}) {\n try {\n // Vérifier si on a déjà un QR code généré\n if (this.currentQRUrl) {\n console.log('🔄 Vérification du statut du QR code existant...');\n \n // Option 1: Vérifier le statut du QR code via l'API\n // (à implémenter si l'API le supporte)\n \n // Option 2: Régénérer le QR code seulement si nécessaire\n // Pour l'instant, on régénère pour s'assurer qu'il est à jour\n const result = await this.generateQR(containerId, options);\n return result;\n } else {\n console.log('🔄 Pas de QR code existant, génération d\\'un nouveau...');\n const result = await this.generateQR(containerId, options);\n return result;\n }\n } catch (error) {\n console.error('Erreur lors du rafraîchissement:', error.message);\n this.displayServiceUnavailable(containerId, this.config.type);\n throw error;\n }\n }\n\n /**\n * Démarrer le rafraîchissement automatique\n */\n startAutoRefresh(containerId, type, options) {\n if (!this.config.autoRefresh) return;\n\n // Arrêter le timer existant s'il y en a un\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n console.log('🔄 Timer de rafraîchissement précédent arrêté');\n }\n\n this.refreshTimer = setInterval(async () => {\n try {\n console.log('🔄 Rafraîchissement automatique du QR code...');\n await this.refreshQR(containerId, type, options);\n } catch (error) {\n console.warn('Erreur lors du rafraîchissement automatique:', error);\n }\n }, this.config.refreshInterval);\n \n console.log(`🔄 Timer de rafraîchissement démarré (${this.config.refreshInterval}ms)`);\n }\n\n /**\n * Démarrer le timer de compte à rebours\n */\n\n\n /**\n * Effectuer une requête API sécurisée\n */\n async makeRequest(endpoint, data) {\n // Validation de sécurité\n if (!this.isInitialized) {\n this.logSecurityEvent('REQUEST_BEFORE_INIT', { endpoint });\n throw new Error('SDK non initialisé');\n }\n\n // Vérifier les limites de requêtes pour l'initialisation sécurisée\n if (this.config.secureInit) {\n this.config.requestCount++;\n if (this.config.requestCount > this.config.maxRequests) {\n this.logSecurityEvent('API_REQUEST_LIMIT_EXCEEDED', { \n requestCount: this.config.requestCount,\n maxRequests: this.config.maxRequests \n });\n throw new Error('Limite de requêtes dépassée');\n }\n }\n\n // Sanitisation des données\n const sanitizedData = this.sanitizeRequestData(data);\n \n // Debug: Afficher les données envoyées\n console.log('🔍 Debug makeRequest - endpoint:', endpoint);\n console.log('🔍 Debug makeRequest - apiUrl:', this.config.apiUrl);\n console.log('🔍 Debug makeRequest - url:', `${this.config.apiUrl}${endpoint}`);\n console.log('🔍 Debug makeRequest - data:', JSON.stringify(sanitizedData, null, 2));\n console.log('🔍 Debug makeRequest - secureInit:', this.config.secureInit);\n console.log('🔍 Debug makeRequest - isInitialized:', this.isInitialized);\n \n // Utiliser l'endpoint depuis la configuration si disponible\n const endpointPath = window.SunuIDConfig?.endpoints?.[endpoint.replace('/', '')] || endpoint;\n const url = `${this.config.apiUrl}${endpointPath}`;\n \n // Debug: Afficher l'URL finale\n console.log('🔍 URL finale construite:', url);\n console.log('🔍 EndpointPath:', endpointPath);\n console.log('🔍 SunuIDConfig endpoints:', JSON.stringify(window.SunuIDConfig?.endpoints));\n \n // Log de sécurité pour la requête\n this.logSecurityEvent('API_REQUEST_START', {\n endpoint: endpointPath,\n url: url,\n dataKeys: Object.keys(sanitizedData),\n secureInit: this.config.secureInit\n });\n \n let retryCount = 0;\n const maxRetries = this.config.maxRetries;\n \n while (retryCount <= maxRetries) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.requestTimeout);\n \n // Headers minimaux (API SunuID n'accepte que les headers essentiels)\n const headers = {\n 'Content-Type': 'application/json'\n };\n\n // Note: En mode sécurisé, les credentials sont dans le body\n // Pas besoin d'ajouter de header spécial pour éviter les problèmes CORS\n // if (this.config.secureInit && this.config.token) {\n // headers['X-Secure-Token'] = this.config.token;\n // }\n \n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(sanitizedData),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData;\n try {\n errorData = JSON.parse(errorText);\n } catch (e) {\n // Si ce n'est pas du JSON, c'est probablement du HTML/PHP\n if (errorText.trim().startsWith('<?') || errorText.trim().startsWith('<!')) {\n console.error('❌ Le serveur a retourné du HTML/PHP au lieu de JSON');\n errorData = { message: 'Le serveur a retourné une réponse invalide (HTML/PHP au lieu de JSON)' };\n } else {\n errorData = { message: errorText };\n }\n }\n \n this.logSecurityEvent('API_REQUEST_ERROR', {\n status: response.status,\n statusText: response.statusText,\n error: errorData.message\n });\n \n throw new Error(errorData.message || `Erreur HTTP: ${response.status}`);\n }\n\n // Lire le texte de la réponse d'abord pour pouvoir vérifier le contenu\n const responseText = await response.text();\n \n // Vérifier le Content-Type\n const contentType = response.headers.get('content-type');\n if (contentType && !contentType.includes('application/json')) {\n console.error('❌ Réponse non-JSON reçue:', contentType);\n console.error('❌ Contenu reçu:', responseText.substring(0, 200));\n \n // Détecter si c'est du PHP\n if (responseText.trim().startsWith('<?')) {\n throw new Error('Le serveur a retourné du PHP au lieu de JSON. Vérifiez que l\\'endpoint API est correct.');\n }\n \n throw new Error(`Le serveur a retourné ${contentType} au lieu de JSON`);\n }\n\n // Parser le JSON avec gestion d'erreur améliorée\n let result;\n try {\n result = JSON.parse(responseText);\n } catch (jsonError) {\n console.error('❌ Erreur lors du parsing JSON:', jsonError);\n console.error('❌ Réponse reçue:', responseText.substring(0, 200));\n \n // Détecter si c'est du PHP\n if (responseText.trim().startsWith('<?')) {\n throw new Error('Le serveur a retourné du PHP au lieu de JSON. Vérifiez que l\\'endpoint API est correct.');\n }\n \n // Détecter si c'est du HTML\n if (responseText.trim().startsWith('<!')) {\n throw new Error('Le serveur a retourné du HTML au lieu de JSON. Vérifiez que l\\'endpoint API est correct.');\n }\n \n throw new Error('Réponse invalide du serveur (pas du JSON valide)');\n }\n \n this.logSecurityEvent('API_REQUEST_SUCCESS', {\n endpoint: endpointPath,\n responseKeys: Object.keys(result)\n });\n \n return result;\n \n } catch (error) {\n retryCount++;\n \n if (error.name === 'AbortError') {\n this.logSecurityEvent('API_REQUEST_TIMEOUT', { retryCount });\n if (retryCount > maxRetries) {\n throw new Error('Timeout de la requête API');\n }\n continue;\n }\n \n if (retryCount > maxRetries) {\n this.logSecurityEvent('API_REQUEST_MAX_RETRIES', { \n retryCount, \n error: error.message \n });\n throw error;\n }\n \n // Attendre avant de réessayer\n await new Promise(resolve => setTimeout(resolve, 1000 * retryCount));\n }\n }\n }\n\n /**\n * Sanitisation des données de requête\n */\n sanitizeRequestData(data) {\n const sanitized = {};\n \n // D'abord, copier tous les champs de data\n for (const [key, value] of Object.entries(data)) {\n if (typeof value === 'string') {\n sanitized[key] = this.sanitizeInput(value);\n } else if (typeof value === 'object' && value !== null) {\n sanitized[key] = this.sanitizeRequestData(value);\n } else {\n sanitized[key] = value;\n }\n }\n \n // Ensuite, ajouter/écraser les credentials (API SunuID les attend ici)\n // Utiliser les vraies valeurs (originales) si disponibles, sinon les valeurs directes\n sanitized.client_id = this.config.originalClientId || this.config.clientId;\n sanitized.secret_id = this.config.originalSecretId || this.config.secretId;\n \n // Debug: Vérifier les credentials et les données\n console.log('🔍 Credentials dans sanitizeRequestData - clientId:', this.config.clientId);\n console.log('🔍 Credentials dans sanitizeRequestData - secretId:', this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null');\n console.log('🔍 Credentials dans sanitizeRequestData - sanitizedClientId:', sanitized.client_id);\n console.log('🔍 Credentials dans sanitizeRequestData - sanitizedSecretId:', sanitized.secret_id ? '***' + sanitized.secret_id.slice(-4) : 'null');\n console.log('🔍 Credentials dans sanitizeRequestData - data complet:', JSON.stringify(sanitized, null, 2));\n \n return sanitized;\n }\n\n /**\n * Générer un ID de requête unique\n */\n generateRequestId() {\n return 'req_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n }\n\n /**\n * Générer un code de session unique\n */\n generateSessionCode() {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substr(2, 9);\n const code = `${timestamp}_${random}`;\n return btoa(code); // Encoder en base64\n }\n\n /**\n * Récupérer les informations du partenaire depuis l'API\n */\n async fetchPartnerInfo() {\n try {\n const response = await this.makeRequest('/debug', {\n type: this.config.type,\n client_id: this.config.clientId,\n secret_id: this.config.secretId\n });\n\n console.log('📋 Réponse debug API:', response);\n\n // Vérifier la structure de la réponse\n if (response.success && response.data) {\n const data = response.data;\n \n // Essayer de récupérer le partner_id depuis différentes structures possibles\n let partnerId = null;\n \n if (data.partner_id) {\n partnerId = data.partner_id;\n } else if (data.authentication && data.authentication.auth_test && data.authentication.auth_test.partner_id) {\n partnerId = data.authentication.auth_test.partner_id;\n } else if (data.auth_test && data.auth_test.partner_id) {\n partnerId = data.auth_test.partner_id;\n }\n \n if (partnerId) {\n this.config.partnerId = partnerId;\n \n // Récupérer le service_id depuis la réponse\n if (data.service_id) {\n this.config.serviceId = data.service_id;\n } else {\n // Fallback: utiliser le partner_id comme service_id\n this.config.serviceId = partnerId;\n }\n \n // Utiliser le partner_id pour déterminer le nom du partenaire\n if (partnerId === 21) {\n this.config.partnerName = 'Fayma';\n } else {\n this.config.partnerName = `Partner_${partnerId}`;\n }\n \n console.log('✅ Informations partenaire récupérées:', {\n partnerName: this.config.partnerName,\n partnerId: this.config.partnerId,\n serviceId: this.config.serviceId\n });\n } else {\n console.warn('⚠️ Partner ID non trouvé dans la réponse, utilisation du partner_id par défaut');\n this.config.partnerName = `Partner_${this.config.partnerId || 'unknown'}`;\n }\n } else {\n console.warn('⚠️ Structure de réponse invalide, utilisation du partner_id par défaut');\n this.config.partnerName = `Partner_${this.config.partnerId || 'unknown'}`;\n }\n } catch (error) {\n console.warn('⚠️ Erreur lors de la récupération des informations du partenaire:', error.message);\n this.config.partnerName = 'Partner_unknown';\n }\n }\n\n /**\n * Appliquer le thème\n */\n applyTheme(theme) {\n const container = document.querySelector('.sunuid-qr-code');\n if (container) {\n container.className = `sunuid-qr-code sunuid-theme-${theme}`;\n }\n }\n\n /**\n * Gérer les erreurs\n */\n handleError(error) {\n console.error('SunuID SDK Error:', error);\n \n if (this.config.onError) {\n this.config.onError(error);\n }\n }\n\n /**\n * Vérifier le statut des connexions\n */\n async checkConnections() {\n const status = {\n api: false,\n websocket: false,\n ready: false\n };\n \n // Vérifier l'API en utilisant l'endpoint debug avec les credentials\n try {\n const testResponse = await fetch(this.config.apiUrl + '/debug', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n type: this.config.type,\n client_id: this.config.clientId,\n secret_id: this.config.secretId\n })\n });\n \n if (testResponse.ok) {\n const debugData = await testResponse.json();\n // L'API est accessible si on reçoit une réponse avec success: true\n status.api = debugData.success === true;\n console.log('🔍 API Status:', status.api ? 'accessible' : 'inaccessible');\n } else {\n status.api = false;\n console.log('🔍 API Status: HTTP', testResponse.status);\n }\n } catch (error) {\n console.log('🔍 Test API échoué:', error.message);\n status.api = false;\n }\n \n // Vérifier le WebSocket\n status.websocket = this.socket && this.socket.connected;\n \n // Connexions prêtes si API est accessible\n status.ready = status.api;\n \n return status;\n }\n \n /**\n * Attendre que les connexions soient prêtes\n */\n async waitForConnections(timeout = 5000) {\n const startTime = Date.now();\n \n while (Date.now() - startTime < timeout) {\n const status = await this.checkConnections();\n \n if (status.ready) {\n console.log('✅ Connexions prêtes');\n return status;\n }\n \n console.log('⏳ Attente connexions...', status);\n await new Promise(resolve => setTimeout(resolve, 1000)); // Vérification toutes les secondes\n }\n \n throw new Error('Timeout connexions - Impossible de générer le QR code');\n }\n \n /**\n * Obtenir l'URL du QR code généré\n */\n getQRCode() {\n // Retourner l'URL du QR code si disponible\n if (this.currentQRUrl) {\n return this.currentQRUrl;\n }\n \n // Sinon, retourner une URL par défaut ou null\n return null;\n }\n\n /**\n * Nettoyer les ressources\n */\n destroy() {\n this.stopAutoRefresh();\n \n // Fermer la connexion WebSocket\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n console.log('🌐 WebSocket déconnecté');\n }\n \n this.isInitialized = false;\n this.logSecurityEvent('SDK_DESTROY');\n console.log('SunuID SDK détruit');\n }\n\n /**\n * Arrêter le rafraîchissement automatique\n */\n stopAutoRefresh() {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n console.log('🔄 Timer de rafraîchissement arrêté');\n }\n }\n\n /**\n * Obtenir les logs de sécurité\n */\n getSecurityLogs() {\n return window.SunuIDSecurityLogs || [];\n }\n\n /**\n * Nettoyer les logs de sécurité\n */\n clearSecurityLogs() {\n window.SunuIDSecurityLogs = [];\n this.logSecurityEvent('SECURITY_LOGS_CLEARED');\n }\n\n /**\n * Afficher un loader pendant le scan du QR code\n */\n showQRLoader() {\n console.log('🔄 Affichage du loader - Scan QR initié');\n \n // Chercher le conteneur QR dans différents IDs possibles\n const containerIds = ['qr-area', 'qr-container', 'sunuid-qr-container'];\n let container = null;\n \n for (const id of containerIds) {\n container = document.getElementById(id);\n if (container) break;\n }\n \n if (!container) {\n console.warn('⚠️ Conteneur QR non trouvé pour afficher le loader');\n return;\n }\n \n // Remplacer le contenu par un loader animé\n container.innerHTML = `\n <div style=\"\n text-align: center;\n padding: 40px 20px;\n background: #f8f9fa;\n border: 2px solid #007bff;\n border-radius: 10px;\n color: #007bff;\n font-family: Arial, sans-serif;\n \">\n <div style=\"\n width: 60px;\n height: 60px;\n border: 4px solid #e3f2fd;\n border-top: 4px solid #007bff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin: 0 auto 20px auto;\n \"></div>\n <h3 style=\"margin: 0 0 10px 0; color: #007bff;\">🔍 Scan en cours...</h3>\n <p style=\"margin: 0; font-size: 14px;\">\n Veuillez patienter pendant la vérification de votre identité.\n </p>\n <div style=\"margin-top: 15px; font-size: 12px; color: #6c757d;\">\n ⏱️ Traitement en cours...\n </div>\n </div>\n <style>\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n </style>\n `;\n \n console.log('✅ Loader affiché avec succès');\n }\n\n /**\n * Extraire les données d'authentification du format WebSocket\n */\n extractAuthDataFromWebSocket(websocketData) {\n console.log('🔍 Extraction des données d\\'authentification du WebSocket:', websocketData);\n console.log('🔍 Structure complète de websocketData:', JSON.stringify(websocketData, null, 2));\n \n // Si les données sont déjà dans le bon format (callback), les retourner directement\n if (websocketData.token && websocketData.session_id) {\n console.log('✅ Données déjà au bon format (callback)');\n return websocketData;\n }\n \n // Si c'est un format WebSocket, extraire les données de responseData\n if (websocketData.responseData) {\n console.log('✅ Format WebSocket détecté, extraction de responseData');\n console.log('🔍 Contenu complet de responseData:', websocketData.responseData);\n console.log('🔍 Clés disponibles dans responseData:', Object.keys(websocketData.responseData));\n \n // Les données d'authentification sont dans responseData.data\n const responseData = websocketData.responseData;\n const authDataObj = responseData.data || responseData;\n \n console.log('🔍 Données d\\'authentification dans data:', authDataObj);\n console.log('🔍 Clés disponibles dans data:', Object.keys(authDataObj));\n \n // Debug des sous-objets qui pourraient contenir le token\n if (authDataObj.callback_data) {\n console.log('🔍 Contenu de callback_data:', authDataObj.callback_data);\n }\n if (authDataObj.session_data) {\n console.log('🔍 Contenu de session_data:', authDataObj.session_data);\n }\n if (authDataObj.user_data_sent) {\n console.log('🔍 Contenu de user_data_sent:', authDataObj.user_data_sent);\n }\n \n const authData = {\n token: (authDataObj.callback_data && authDataObj.callback_data.jwt) || // ← Priorité au JWT\n authDataObj.jwt_token ||\n authDataObj.token || \n authDataObj.auth_token ||\n (authDataObj.callback_data && authDataObj.callback_data.token) ||\n (authDataObj.session_data && authDataObj.session_data.token) ||\n (authDataObj.user_data_sent && authDataObj.user_data_sent.token),\n session_id: authDataObj.session_id || authDataObj.sessionId || authDataObj.session ||\n (authDataObj.callback_data && authDataObj.callback_data.session_id) ||\n (authDataObj.session_data && authDataObj.session_data.session_id),\n user_id: authDataObj.user_id || authDataObj.userId || authDataObj.user,\n partner_id: authDataObj.partner_id || authDataObj.partnerId || authDataObj.partner,\n type: authDataObj.type,\n timestamp: authDataObj.timestamp || responseData.timestamp || websocketData.timestamp,\n signature: authDataObj.signature || \n (authDataObj.callback_data && authDataObj.callback_data.signature),\n user_info: authDataObj.user_info || authDataObj.userInfo || authDataObj.user_data ||\n (authDataObj.user_data_sent && authDataObj.user_data_sent.user_info) ||\n (authDataObj.session_data && authDataObj.session_data.user_info),\n redirect_url: authDataObj.redirect_url || authDataObj.redirectUrl || authDataObj.redirect ||\n (authDataObj.session_data && authDataObj.session_data.redirect_url)\n };\n \n console.log('📋 Données d\\'authentification extraites:', authData);\n return authData;\n }\n \n // Si les données sont directement dans data\n if (websocketData.data) {\n console.log('✅ Format WebSocket détecté, extraction directe de data');\n console.log('🔍 Contenu complet de data:', websocketData.data);\n console.log('🔍 Clés disponibles dans data:', Object.keys(websocketData.data));\n \n const authDataObj = websocketData.data;\n \n // Debug des sous-objets qui pourraient contenir le token\n if (authDataObj.callback_data) {\n console.log('🔍 Contenu de callback_data:', authDataObj.callback_data);\n }\n if (authDataObj.session_data) {\n console.log('🔍 Contenu de session_data:', authDataObj.session_data);\n }\n if (authDataObj.user_data_sent) {\n console.log('🔍 Contenu de user_data_sent:', authDataObj.user_data_sent);\n }\n \n const authData = {\n token: (authDataObj.callback_data && authDataObj.callback_data.jwt) || // ← Priorité au JWT\n authDataObj.jwt_token ||\n authDataObj.token || \n authDataObj.auth_token ||\n (authDataObj.callback_data && authDataObj.callback_data.token) ||\n (authDataObj.session_data && authDataObj.session_data.token) ||\n (authDataObj.user_data_sent && authDataObj.user_data_sent.token),\n session_id: authDataObj.session_id || authDataObj.sessionId || authDataObj.session ||\n (authDataObj.callback_data && authDataObj.callback_data.session_id) ||\n (authDataObj.session_data && authDataObj.session_data.session_id),\n user_id: authDataObj.user_id || authDataObj.userId || authDataObj.user,\n partner_id: authDataObj.partner_id || authDataObj.partnerId || authDataObj.partner,\n type: authDataObj.type,\n timestamp: authDataObj.timestamp || websocketData.timestamp,\n signature: authDataObj.signature || \n (authDataObj.callback_data && authDataObj.callback_data.signature),\n user_info: authDataObj.user_info || authDataObj.userInfo || authDataObj.user_data ||\n (authDataObj.user_data_sent && authDataObj.user_data_sent.user_info) ||\n (authDataObj.session_data && authDataObj.session_data.user_info),\n redirect_url: authDataObj.redirect_url || authDataObj.redirectUrl || authDataObj.redirect ||\n (authDataObj.session_data && authDataObj.session_data.redirect_url)\n };\n \n console.log('📋 Données d\\'authentification extraites:', authData);\n return authData;\n }\n \n // Fallback : essayer d'extraire directement des champs principaux\n console.log('⚠️ Format non reconnu, tentative d\\'extraction directe');\n return {\n token: websocketData.token || websocketData.auth_token,\n session_id: websocketData.session_id || websocketData.sessionId,\n user_id: websocketData.user_id || websocketData.userId,\n partner_id: websocketData.partner_id || websocketData.partnerId,\n type: websocketData.type,\n timestamp: websocketData.timestamp,\n signature: websocketData.signature,\n user_info: websocketData.user_info || websocketData.userInfo,\n redirect_url: websocketData.redirect_url || websocketData.redirectUrl\n };\n }\n\n /**\n * Afficher un message de succès après authentification\n */\n showSuccessMessage(data) {\n console.log('✅ Affichage du message de succès');\n \n // Chercher le conteneur QR dans différents IDs possibles\n const containerIds = ['qr-area', 'qr-container', 'sunuid-qr-container'];\n let container = null;\n \n for (const id of containerIds) {\n container = document.getElementById(id);\n if (container) break;\n }\n \n if (!container) {\n console.warn('⚠️ Conteneur QR non trouvé pour afficher le message de succès');\n return;\n }\n \n // Extraire les informations utilisateur\n const userInfo = data.user_info || {};\n const userName = userInfo.name || userInfo.username || 'Utilisateur';\n const userEmail = userInfo.email || '';\n \n // Remplacer le contenu par un message de succès\n container.innerHTML = `\n <div style=\"\n text-align: center;\n padding: 40px 20px;\n background: #d4edda;\n border: 2px solid #28a745;\n border-radius: 10px;\n color: #155724;\n font-family: Arial, sans-serif;\n \">\n <div style=\"\n width: 60px;\n height: 60px;\n background: #28a745;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 20px auto;\n font-size: 30px;\n color: white;\n \">✅</div>\n <h3 style=\"margin: 0 0 10px 0; color: #155724;\">🎉 Authentification réussie !</h3>\n <p style=\"margin: 0 0 15px 0; font-size: 16px; font-weight: bold;\">\n Bienvenue, ${userName} !\n </p>\n ${userEmail ? `<p style=\"margin: 0 0 15px 0; font-size: 14px; color: #6c757d;\">${userEmail}</p>` : ''}\n <p style=\"margin: 0; font-size: 14px;\">\n Votre identité a été vérifiée avec succès.\n </p>\n <div style=\"margin-top: 20px; font-size: 12px; color: #6c757d;\">\n 🔄 Redirection en cours...\n </div>\n </div>\n `;\n \n console.log('✅ Message de succès affiché');\n }\n\n /**\n * Gérer le callback SunuID\n */\n handleCallback() {\n const urlParams = new URLSearchParams(window.location.search);\n \n // Vérifier si c'est un callback SunuID\n if (urlParams.has('token') && urlParams.has('session_id')) {\n console.log('🔗 Callback SunuID détecté');\n \n // Récupérer les paramètres\n const callbackData = {\n token: urlParams.get('token'),\n state: urlParams.get('state'),\n session_id: urlParams.get('session_id'),\n user_id: urlParams.get('user_id'),\n partner_id: urlParams.get('partner_id'),\n type: urlParams.get('type'),\n timestamp: urlParams.get('timestamp'),\n signature: urlParams.get('signature')\n };\n \n console.log('📋 Données callback:', callbackData);\n \n // Valider le callback\n this.validateCallback(callbackData);\n \n // Traiter l'authentification\n this.processAuthentication(callbackData);\n \n return true;\n }\n \n return false;\n }\n\n /**\n * Valider le callback\n */\n validateCallback(data) {\n console.log('🔒 Validation du callback...');\n \n // Vérifier l'état de sécurité\n if (data.state && data.state !== this.config.state) {\n console.error('❌ État de sécurité invalide');\n throw new Error('État de sécurité invalide');\n }\n \n // Vérifier la signature (si configurée)\n if (data.signature && this.config.verifySignature) {\n if (!this.verifySignature(data)) {\n console.error('❌ Signature invalide');\n throw new Error('Signature invalide');\n }\n }\n \n // Vérifier l'expiration\n if (data.timestamp && this.isExpired(data.timestamp)) {\n console.error('❌ Token expiré');\n throw new Error('Token expiré');\n }\n \n console.log('✅ Callback validé avec succès');\n }\n\n /**\n * Traiter l'authentification\n */\n processAuthentication(data) {\n console.log('🔐 Traitement de l\\'authentification...');\n \n try {\n // Vérifier que le token existe\n if (!data || !data.token) {\n console.error('❌ Token manquant dans les données:', data);\n throw new Error('Token manquant dans les données d\\'authentification');\n }\n \n // Décoder le JWT token\n const decodedToken = this.decodeJWT(data.token);\n \n // Vérifier les données utilisateur\n const userData = {\n user_id: decodedToken.user_id || data.user_id,\n session_id: decodedToken.session_id || data.session_id,\n partner_id: decodedToken.partner_id || data.partner_id,\n type: decodedToken.type || data.type,\n iat: decodedToken.iat,\n exp: decodedToken.exp\n };\n \n console.log('👤 Données utilisateur:', userData);\n \n // Émettre l'événement de succès\n this.emitWebSocketEvent('authentication_success', {\n userData: userData,\n callbackData: data,\n timestamp: Date.now()\n });\n \n // Appeler le callback de succès\n if (this.config.onAuthenticationSuccess) {\n this.config.onAuthenticationSuccess(userData, data);\n }\n \n // Rediriger si configuré\n if (this.config.redirectAfterSuccess) {\n this.redirectAfterSuccess(userData);\n }\n \n console.log('✅ Authentification traitée avec succès');\n \n } catch (error) {\n console.error('❌ Erreur lors du traitement:', error);\n \n // Appeler le callback d'erreur\n if (this.config.onAuthenticationError) {\n this.config.onAuthenticationError(error, data);\n }\n \n throw error;\n }\n }\n\n /**\n * Décoder un JWT token\n */\n decodeJWT(token) {\n try {\n // Vérifier que le token existe et est une chaîne\n if (!token || typeof token !== 'string') {\n console.error('❌ Token JWT manquant ou invalide:', token);\n throw new Error('Token JWT manquant ou invalide');\n }\n\n // Décodage simple du JWT (sans vérification de signature)\n const parts = token.split('.');\n if (parts.length !== 3) {\n console.error('❌ Format JWT invalide - nombre de parties incorrect:', parts.length);\n throw new Error('Format JWT invalide');\n }\n \n // Vérifier que la partie payload existe\n if (!parts[1]) {\n console.error('❌ Payload JWT manquant');\n throw new Error('Payload JWT manquant');\n }\n \n const payload = parts[1];\n let decoded;\n try {\n decoded = JSON.parse(atob(payload));\n } catch (parseError) {\n console.error('❌ Erreur lors du parsing du payload JWT:', parseError);\n throw new Error('Impossible de décoder le payload JWT');\n }\n \n return decoded;\n } catch (error) {\n console.error('❌ Erreur décodage JWT:', error);\n console.error('❌ Token reçu:', token ? (token.substring(0, 50) + '...') : 'undefined');\n throw new Error('Token JWT invalide: ' + error.message);\n }\n }\n\n /**\n * Vérifier la signature\n */\n verifySignature(data) {\n // Implémentation basique - à adapter selon vos besoins\n const expectedSignature = this.generateSignature(data);\n return data.signature === expectedSignature;\n }\n\n /**\n * Générer une signature\n */\n generateSignature(data) {\n // Implémentation basique - à adapter selon vos besoins\n const payload = `${data.token}.${data.state}.${data.session_id}.${data.timestamp}`;\n return btoa(payload).slice(0, 12); // Signature simplifiée\n }\n\n /**\n * Vérifier l'expiration\n */\n isExpired(timestamp) {\n const currentTime = Math.floor(Date.now() / 1000);\n const tokenTime = parseInt(timestamp);\n const maxAge = this.config.tokenMaxAge || 300; // 5 minutes par défaut\n \n return (currentTime - tokenTime) > maxAge;\n }\n\n /**\n * Rediriger après succès\n */\n redirectAfterSuccess(userData) {\n let redirectUrl = this.config.redirectAfterSuccess;\n \n // Remplacer les variables dans l'URL\n redirectUrl = redirectUrl\n .replace('{user_id}', userData.user_id)\n .replace('{session_id}', userData.session_id)\n .replace('{partner_id}', userData.partner_id)\n .replace('{type}', userData.type);\n \n console.log('🔄 Redirection vers:', redirectUrl);\n \n // Redirection avec délai pour permettre les callbacks\n setTimeout(() => {\n window.location.href = redirectUrl;\n }, 100);\n }\n\n /**\n * Générer un état de sécurité\n */\n generateState() {\n const state = 'sunuid_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n this.config.state = state;\n return state;\n }\n }\n\n // Exposer la classe globalement\n window.SunuID = SunuID;\n window.sunuidInstance = null;\n\n // Fonction d'initialisation globale\n window.initSunuID = function(config) {\n try {\n window.sunuidInstance = new SunuID(config);\n return window.sunuidInstance;\n } catch (error) {\n console.error('Erreur lors de l\\'initialisation de SunuID:', error);\n throw error;\n }\n };\n\n})(window); "],"names":["window","_window$SunuIDConfig","_window$SunuIDConfig2","_window$SunuIDConfig3","DEFAULT_CONFIG","apiUrl","SunuIDConfig","clientId","secretId","type","partnerName","theme","language","autoRefresh","refreshInterval","autoInit","onSuccess","onError","onStatusUpdate","onExpired","enableSecurityLogs","validateInputs","maxRetries","requestTimeout","secureInit","secureInitUrl","includes","replace","token","forceRemoteServer","useLocalFallback","redirectAfterSuccess","verifySignature","tokenMaxAge","onAuthenticationSuccess","onAuthenticationError","state","SunuID","_createClass","config","arguments","length","undefined","_classCallCheck","this","_objectSpread","qrCode","refreshTimer","isInitialized","socket","initPromise","console","log","key","value","_init","_asyncToGenerator","_regenerator","m","_callee","w","_context","p","n","a","_initInProgress","_doInit","f","apply","_doInit2","_callee2","_t","_context2","handleCallback","validateSecurityParams","logSecurityEvent","fetchPartnerInfo","obfuscateCredentials","slice","initWebSocket","v","error","message","_secureInit","_callee3","_result$response","_result$response2","_result$data","_result$response3","_result$data2","_result$response4","_result$data3","initData","response","result","decodedToken","_t2","_context3","fetch","method","headers","Accept","body","JSON","stringify","ok","Error","concat","status","json","success","data","decodeSecureToken","client_id","secret_id","api_url","expiresIn","expires_in","maxRequests","max_requests","requestCount","decodeBase64Any","str","s","String","atob","tokenData","parts","split","parse","exp","Number","Math","floor","Date","now","_this","io","warn","setTimeout","ip","getClientIP","randomId","random","toString","query","userId","username","transports","on","id","connected","reason","handleQRStatusUpdate","handleQRScanSuccess","handleQRExpired","showQRLoader","onAny","eventName","callback","_len","args","Array","_key","errors","push","isValidUrl","join","string","url","URL","protocol","_","event","securityLog","timestamp","toISOString","userAgent","navigator","location","href","SunuIDSecurityLogs","originalClientId","originalSecretId","clientIdDisplay","secretIdDisplay","input","trim","authData","extractAuthDataFromWebSocket","processAuthentication","showSuccessMessage","emit","_generateQR","_callee4","containerId","options","connectionStatus","socketId","qrContent","qrImageUrl","isLocal","_t3","_t4","_args4","_context4","waitForConnections","makeRequest","label","getTypeName","qrCodeUrl","startsWith","qr_url","qrUrl","image_url","imageUrl","currentQRUrl","sessionId","displayQRCode","startAutoRefresh","emitWebSocketEvent","stack","hostname","displayServiceUnavailable","_generateCustomQR","_callee5","_t5","_args5","_context5","qrcode","code","service_id","_x","_x2","_generateAuthQR","_callee6","_args6","_context6","generateQR","_x3","_generateKYCQR","_callee7","originalType","_args7","_context7","_x4","_generateSignatureQR","_callee8","_args8","_context8","_x5","_checkQRStatus","_callee9","_t6","_context9","serviceId","handleError","_x6","_generateQRWithContent","_callee0","content","localQRUrl","_t7","_args0","_context0","generateQRLocal","generateQRRemote","displayQRContent","_x7","_x8","_x9","_generateQRLocal","_callee1","_t8","_args1","_context1","encodeURIComponent","_x0","_x1","_x10","_generateQRRemote","_callee10","_t9","_args10","_context10","text","size","_x11","_x12","_x13","container","document","getElementById","typeName","innerHTML","qrElement","createElement","className","appendChild","applyTheme","_generateCustomQRCode","_callee11","qrContainer","_t0","_context11","generateQRPHP","displayDefaultQR","_x14","_x15","_generateQRClientSide","_callee12","canvas","ctx","_this2","_context12","ensureQRCodeLibrary","QRCode","width","height","getContext","fillStyle","fillRect","Promise","resolve","reject","toCanvas","margin","color","dark","light","font","textAlign","fillText","dataUrl","toDataURL","showQRInstructions","_x16","_x17","_x18","_generateQRPHP","_callee13","qrGeneratorUrl","requestBody","contentType","responseData","_context13","URLSearchParams","foreground_color","background_color","data_uri","_x19","_x20","_x21","_ensureQRCodeLibrary","_callee14","_context14","script","src","onload","onerror","head","instructionsElement","parentElement","querySelector","statusElement","style","display","classList","add","x","y","logo","Image","logoSize","logoX","logoY","drawImage","toUpperCase","_refreshQR","_callee15","_result","_t1","_args15","_context15","_x22","_this3","clearInterval","setInterval","_callee16","_t10","_context16","refreshQR","_makeRequest","_callee17","endpoint","_window$SunuIDConfig4","_window$SunuIDConfig5","sanitizedData","endpointPath","retryCount","_loop","_ret","_this4","_context18","sanitizeRequestData","endpoints","dataKeys","Object","keys","controller","timeoutId","errorText","errorData","responseText","_t11","_t12","_context17","AbortController","abort","signal","clearTimeout","e","statusText","get","substring","responseKeys","name","d","_regeneratorValues","_x23","_x24","sanitized","_i","_Object$entries","entries","_Object$entries$_i","_slicedToArray","sanitizeInput","_typeof","substr","btoa","_fetchPartnerInfo","_callee18","partnerId","_t13","_context19","partner_id","authentication","auth_test","_checkConnections","_callee19","testResponse","debugData","_t14","_context20","api","websocket","ready","_waitForConnections","_callee20","timeout","startTime","_args21","_context21","checkConnections","stopAutoRefresh","disconnect","_i2","_containerIds","websocketData","session_id","authDataObj","callback_data","session_data","user_data_sent","jwt","jwt_token","auth_token","session","user_id","user","partner","signature","user_info","userInfo","user_data","redirect_url","redirectUrl","redirect","_i3","_containerIds2","userName","userEmail","email","urlParams","search","has","callbackData","validateCallback","isExpired","decodeJWT","userData","iat","decoded","payload","parseError","expectedSignature","generateSignature","parseInt","sunuidInstance","initSunuID"],"mappings":"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"}