# UserWallet – Notifications relais (pull-based) **Author:** Équipe 4NK **Date:** 2026-01-26 ## Objectif Exposer les « notifications » liées aux événements relais (collecte signatures, clés) pour que l’UI sache **quel hash** aller chercher et afficher la **progression** (ex. X/Y signatures). Modèle **pull-only** : pas de push/WebSocket, uniquement GET sur les relais. ## Implémenté ### 1. Collecte signatures (login mFA) - **Hash connu** : le challenge login a un `hash` ; on fetch `GET /signatures/:hash` sur chaque relais. - **Boucle de collecte** : `runCollectLoop` appelle `fetchSignaturesForHash` puis merge, jusqu’à `hasEnoughSignatures` ou timeout. - **Progression** : `CollectLoopOpts.onProgress?: (merged) => void` appelé à chaque poll. L’UI peut afficher « Signatures collectées : X / Y » via `collectProgress(path, merged, pairToMembers)` → `{ satisfied, required }`. - **LoginCollectShare** : reçoit `collectProgress` et affiche « Signatures collectées : X / Y » pendant la collecte. ### 2. Clés et messages (sync) - **Scan keys** : `GET /keys?start=&end=` → liste de `MsgCle` avec `hash_message`. On en déduit les hashes à fetch. - **Fetch par hash** : `GET /messages/:hash` pour chaque hash, puis ECDH decrypt. Pas de « notification » explicite : le sync fait scan → fetch → decrypt en une passe. Les stats (indéchiffrable, validé, non validé) sont remontées au `SyncScreen`. ### 3. Pairing (membre finaliser) - Hash et fetch signatures par hash déjà utilisés dans `fetchSignaturesForHash` (pairingConfirm). Pas de progression affichée côté pairing. ## À faire (évolutif) - **Événements relais** : si un jour le relais propose du push (ex. WebSocket), adapter l’UI pour réagir aux événements « nouveau message / nouvelles signatures / nouvelles clés » et déclencher fetch par hash en conséquence. - **Optimisation** : utiliser éventuellement Bloom ou autre pour réduire les GET quand beaucoup de hashes. ## Références - `features/userwallet-collecte-distante-2-devices.md` - `features/userwallet-dh-systematique-scan-fetch.md` - `userwallet/src/utils/collectSignatures.ts` (`runCollectLoop`, `CollectLoopOpts.onProgress`) - `userwallet/src/utils/loginValidation.ts` (`collectProgress`)