**Motivations:** - Add new features and fixes for userwallet application - Update documentation for pairing, login state machine, and sync - Add new utilities for bloom filters, nonce store, and contract versioning - Fix mempool websocket offline issues **Root causes:** - N/A (feature additions and improvements) **Correctifs:** - Fix mempool websocket offline handling - Update ESLint configuration **Evolutions:** - Add login state machine service and hook - Add sync loop service - Add bloom filter utilities for anti-replay and state visibility - Add nonce store and contract version utilities - Update pairing confirmation and graph resolver services - Add new documentation for features and fixes - Update userwallet components (LoginScreen, SyncScreen) - Update types for contract, identity, and messages **Pages affectées:** - userwallet/src/components/LoginScreen.tsx - userwallet/src/components/SyncScreen.tsx - userwallet/src/hooks/useChannel.ts - userwallet/src/hooks/useLoginStateMachine.ts (new) - userwallet/src/services/graphResolver.ts - userwallet/src/services/pairingConfirm.ts - userwallet/src/services/syncService.ts - userwallet/src/services/syncLoop.ts (new) - userwallet/src/services/loginStateMachine.ts (new) - userwallet/src/types/contract.ts - userwallet/src/types/identity.ts - userwallet/src/types/message.ts - userwallet/src/utils/canonical.ts - userwallet/src/utils/identity.ts - userwallet/src/utils/indexedDbStorage.ts - userwallet/src/utils/relay.ts - userwallet/src/utils/verification.ts - userwallet/src/utils/bloom.ts (new) - userwallet/src/utils/contractVersion.ts (new) - userwallet/src/utils/nonceStore.ts (new) - userwallet/eslint.config.mjs - userwallet/package.json - userwallet/package-lock.json - userwallet/docs/synthese.md - userwallet/docs/specs-champs-obligatoires-cnil.md (new) - api-relay/README.md - features/userwallet-pairing-words-only-finalise.md - features/userwallet-anti-rejeu-etats-visibles-bloom.md (new) - features/userwallet-bloom-usage-sync.md (new) - features/userwallet-contrat-login-reste-a-faire.md (new) - features/userwallet-ecrans-login-a-valider.md (new) - features/userwallet-eslint-fix.md (new) - features/userwallet-login-state-machine.md (new) - features/userwallet-validation-conformite.md (new) - fixKnowledge/mempool-websocket-offline-fix.md (new) - mempool (submodule) - hash_list.txt - hash_list_cache.txt
4.1 KiB
4.1 KiB
Synthèse – API Relay (UserWallet)
Author: Équipe 4NK
Date: 2026-01-26
1. Rôle
Relais de stockage et de diffusion pour le login décentralisé UserWallet : messages chiffrés, signatures et clés publiés séparément, adressés par hash, récupération par GET (pull). Pas de destinataire explicite ; déduplication par hash.
2. Stack
- Runtime : Node.js, ESM (
"type": "module"). - Serveur : Express,
http.createServer, timeout configurable. - Build : TypeScript,
module/moduleResolutionNode16, imports.js.npm start→node dist/index.js. - Middleware : CORS (origines via
CORS_ORIGINS), Pino (logging HTTP), compression gzip,express-rate-limit,express.json(body limit). - Validation :
lib/validate(MsgChiffre, MsgSignature, MsgCle) ; 400 si corps invalide. - Métriques : Prometheus (
prom-client),GET /metrics.
3. Structure
src/
index.ts # Bootstrap, storage, relay, routes, server timeout
lib/
logger.ts # Pino
validate.ts # validateMsgChiffre, validateMsgSignature, validateMsgCle
middleware/
index.ts # CORS, logging, compression, rate limit ; getBodyLimit, getRequestTimeoutMs
routes/
health.ts # GET /health
messages.ts # GET/POST /messages, GET /messages/:hash
signatures.ts # GET /signatures/:hash, POST /signatures
keys.ts # GET /keys/:hash, POST /keys
metrics.ts # GET /metrics
bloom.ts # GET /bloom
services/
storage.ts # StorageService (messages, signatures, keys, seenHashes, byService)
relay.ts # RelayService (relayMessage, relaySignature, relayKey)
types/
message.ts # MsgChiffre, MsgSignature, MsgCle, Stored*
4. Endpoints
| Méthode | Chemin | Description |
|---|---|---|
| GET | /health | { status: 'ok', timestamp } |
| GET | /messages?start=&end=&service= | Messages dans la fenêtre ; service optionnel (index byService). |
| POST | /messages | Enregistrement + relais si hash non vu. |
| GET | /messages/:hash | Message par hash. |
| GET | /signatures/:hash | Signatures pour un message. |
| POST | /signatures | Enregistrement + relais. |
| GET | /keys/:hash | Clés de déchiffrement pour un message. |
| POST | /keys | Enregistrement + relais. |
| GET | /metrics | Métriques Prometheus (relay_storage_entries{kind}). |
| GET | /bloom | Bloom filter (JSON) des hash vus. |
5. Configuration (env)
- PORT, HOST : écoute (défaut 3019, 0.0.0.0).
- STORAGE_PATH : répertoire de persistance (défaut
./data). - PEER_RELAYS : relais pairs (virgule), ex.
http://relay1:3019,http://relay2:3019. - SAVE_INTERVAL_SECONDS : sauvegarde périodique (défaut 300 ; 0 = désactivé).
- BODY_LIMIT, REQUEST_TIMEOUT_MS : body JSON max, timeout HTTP.
- RATE_LIMIT_WINDOW_MS, RATE_LIMIT_MAX : fenêtre et max requêtes par IP.
- CORS_ORIGINS : origines autorisées (virgule) ; vide = toutes.
- LOG_LEVEL, NODE_ENV : Pino et environnement.
6. Stockage
- Mémoire :
messages,signatures,keys,seenHashes, indexbyService. - Disque :
{STORAGE_PATH}/messages.json(messages, seenHashes, signatures, keys). Chargement au démarrage ; sauvegarde à l’arrêt (SIGINT/SIGTERM) et périodique siSAVE_INTERVAL_SECONDS> 0. - Limitations : pas de base SQLite/PostgreSQL ; en production, une base dédiée est recommandée.
7. Déploiement
- Dev :
npm run dev(tsx watch). - Build :
npm run buildpuisnpm startou./start.sh. - Systemd :
api-relay.service;WorkingDirectory= repo,ExecStart=./start.sh. Voir README.
8. Liens avec UserWallet
- UserWallet appelle les endpoints (messages, signatures, keys, health) via
utils/relay. - Types alignés : MsgChiffre, MsgSignature, MsgCle (
datajson_public, etc.). - Port par défaut 3019 ; front 3018. Proxy Nginx : voir
features/nginx-proxy-relay-certificator.md.
9. Références
- README :
api-relay/README.md. - Évolutions :
features/api-relay-evolutions.md. - Persistance :
features/api-relay-persistence-signatures-keys-periodic-save.md.