# API Relay – Persistance signatures/clés et sauvegarde périodique **Author:** Équipe 4NK **Date:** 2026-01-26 ## Objectif - Persister les signatures et les clés de déchiffrement sur disque (au même titre que les messages et seenHashes), afin qu’elles survivent au redémarrage du relais. - Ajouter une sauvegarde périodique configurable pour limiter la perte de données entre deux arrêts propres. ## Impacts - **Fonctionnels** : Les signatures et clés ne sont plus perdues au redémarrage. Réduction du risque de perte en cas de crash entre deux sauvegardes grâce à la sauvegarde périodique. - **Techniques** : Extension du fichier `messages.json` (signatures, keys), nouveau timer de sauvegarde, variable d’environnement `SAVE_INTERVAL_SECONDS`. Gestion d’erreur explicite au chargement (ENOENT vs autres). ## Modifications ### api-relay - **`src/services/storage.ts`** - `loadFromDisk` : lecture de `messages.json`. Si `signatures` / `keys` présents, chargement dans les Maps. ENOENT = premier run (démarrage à vide) ; autres erreurs loggées et propagées. Parse JSON avec try/catch, log + rethrow. - `saveToDisk` : écriture de `messages`, `seenHashes`, `signatures`, `keys` dans `messages.json`. Suppression du try/catch silencieux ; les erreurs remontent. - `initialize` : plus de catch qui absorbe les erreurs de `loadFromDisk` ; propagation. - **`src/index.ts`** - `SAVE_INTERVAL_SECONDS` : env, défaut 300, 0 = désactivé. - `setInterval` (si > 0) : appel à `storage.saveToDisk()` toutes les N secondes ; `.catch` logue les erreurs. - Shutdown (SIGINT/SIGTERM) : `clearInterval`, puis `saveToDisk`, puis `process.exit(0)` ou `1` en cas d’erreur. ### Documentation - **`userwallet/docs/storage.md`** : Synthèse, structure disque, Persistance, Configuration, Limitations (suppression des anciennes limitations « sigs/clés non persistées », « pas de sauvegarde périodique »). - **`api-relay/README.md`** : Variable `SAVE_INTERVAL_SECONDS`, section Stockage mise à jour. ## Modalités de déploiement - Redémarrer le serveur api-relay après déploiement. - Les relais existants avec un `messages.json` sans `signatures` ni `keys` continuent de fonctionner ; les champs sont optionnels au chargement. - Pour désactiver la sauvegarde périodique : `SAVE_INTERVAL_SECONDS=0`. ## Modalités d’analyse - Vérifier qu’après POST /signatures et POST /keys, un redémarrage du relais conserve les données (GET /signatures/:hash, GET /keys/:hash). - Vérifier qu’en cas d’erreur disque au chargement (fichier corrompu, permissions), le processus logue et exit avec erreur (pas de démarrage à vide silencieux). - Vérifier que la sauvegarde périodique écrit bien `messages.json` (timestamp de modification) et que les logs « Periodic save failed » apparaissent en cas d’échec.