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: `
-
-
Liaison avec ${event.origin}
-
Vous êtes sur le point de lier l'identité numérique de la clé securisée propre à votre appareil avec ${event.origin}.
-
Cette action permettra à ${event.origin} d'intéragir avec votre appareil.
-
Voulez-vous continuer ?
-
- `,
- 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,