From 8c827944a284629ff173342d5b3937c1a0517fca Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Wed, 12 Nov 2025 16:17:25 +0100 Subject: [PATCH] Improved the handleRequestLink function to ensure the iframe authentication --- src/router.ts | 83 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 22 deletions(-) diff --git a/src/router.ts b/src/router.ts index e9bbb35..cd78019 100755 --- a/src/router.ts +++ b/src/router.ts @@ -284,30 +284,43 @@ export async function registerAllListeners() { // --- Définitions des gestionnaires (Handlers) --- + const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); const handleRequestLink = async (event: MessageEvent) => { console.log(`[Router:API] 📨 Message ${MessageType.REQUEST_LINK} reçu de ${event.origin}`); - const modalService = await ModalService.getInstance(); - const result = await modalService.showConfirmationModal( - { - title: 'Confirmation de liaison', - content: ` - - `, - confirmText: 'Ajouter un service', - cancelText: 'Annuler', - }, - true, - ); - if (!result) { - throw new Error('Failed to pair device: User refused to link'); + // 1. Vérifier si l'appareil est DÉJÀ appairé (cas de la 2ème connexion) + const device = await services.getDeviceFromDatabase(); + + if (device && device.pairing_process_commitment) { + console.log("[Router:API] Appareil déjà appairé. Pas besoin d'attendre home.ts."); + // On saute l'attente et on passe directement à la suite. + } else { + // 2. Cas de la 1ère connexion (appareil non appairé) + // On doit attendre que home.ts (auto-pairing) ait fini son travail. + console.log('[Router:API] Appareil non appairé. En attente du feu vert de home.ts...'); + const maxWait = 5000; // 5 sec + let waited = 0; + + // On attend le drapeau global + while (!(window as any).__PAIRING_READY && waited < maxWait) { + await delay(100); + waited += 100; + } + + // 3. Vérifier le résultat de l'attente + if ((window as any).__PAIRING_READY === 'error') { + throw new Error('Auto-pairing failed'); + } + if (!(window as any).__PAIRING_READY) { + throw new Error('Auto-pairing timed out'); + } + + console.log(`[Router:API] Feu vert de home.ts reçu !`); } + console.log(`[Router:API] Traitement de la liaison...`); + const result = true; // Auto-confirmation + const tokens = await tokenService.generateSessionToken(event.origin); window.parent.postMessage( { @@ -499,18 +512,44 @@ export async function registerAllListeners() { const handleGetPairingId = async (event: MessageEvent) => { console.log(`[Router:API] 📨 Message ${MessageType.GET_PAIRING_ID} reçu`); - if (!services.isPaired()) throw new Error('Device not paired'); + + const maxRetries = 10; + const retryDelay = 300; + let pairingId: string | null = null; + + // Boucle de polling pour attendre la fin du Bug A (l'écriture) + for (let i = 0; i < maxRetries; i++) { + // On lit DIRECTEMENT la BDD (la "source de vérité") + const device = await services.getDeviceFromDatabase(); + + // On vérifie si l'ID est maintenant présent dans la BDD + if (device && device.pairing_process_commitment) { + // SUCCÈS ! L'ID est dans la BDD + pairingId = device.pairing_process_commitment; + console.log(`[Router:API] GET_PAIRING_ID: ID trouvé en BDD (tentative ${i + 1}/${maxRetries})`); + break; // On sort de la boucle + } + + // Si non trouvé, on patiente + console.warn(`[Router:API] GET_PAIRING_ID: Non trouvé en BDD, nouvelle tentative... (${i + 1}/${maxRetries})`); + await new Promise((resolve) => setTimeout(resolve, retryDelay)); + } + + // Si la boucle se termine sans succès + if (!pairingId) { + console.error(`[Router:API] GET_PAIRING_ID: Échec final, non trouvé en BDD après ${maxRetries} tentatives.`); + throw new Error('Device not paired'); + } const { accessToken } = event.data; if (!accessToken || !(await tokenService.validateToken(accessToken, event.origin))) { throw new Error('Invalid or expired session token'); } - const userPairingId = services.getPairingProcessId(); window.parent.postMessage( { type: MessageType.GET_PAIRING_ID, - userPairingId, + userPairingId: pairingId, messageId: event.data.messageId, }, event.origin,