Architecture d'un projet Runique

Stack Middleware

Ordre des slots

Runique applique les middlewares dans un ordre optimal via le système de slots :

Requête entrante
    ↓
1.  Extensions (slot 0)       → Injection Tera, Config, Engine
2.  TrustedProxies (slot 2)   → IP cliente réelle
3.  Compression (slot 5)      → Compression externe
4.  CORS (slot 8)             → Avant ErrorHandler (preflight OPTIONS)
5.  ErrorHandler (slot 10)    → Capture et rendu des erreurs
6.  HostValidation (slot 15)  → Validation Allowed Hosts
7.  Custom (slot 20+)         → Middlewares personnalisés
8.  OpenRedirect (slot 25)    → Inspection des réponses 3xx
9.  Security Headers (slot 30) → HSTS, X-Frame-Options, etc.
10. CSP (slot 31)             → Content Security Policy
11. Cache (slot 40)           → No-cache en développement
12. Session (slot 50)         → Gestion des sessions
13. SessionUpgrade (slot 55)  → Lecture/écriture en session
14. Auth (slot 57)            → Charge CurrentUser depuis la session
15. CSRF (slot 60)            → Protection CSRF
16. AntiBot (slot 65)         → Honeypot
    ↓
Handler (votre code)
    ↓
Réponse sortante (middlewares en sens inverse)

Important : Avec Axum, le dernier .layer() appliqué est le premier exécuté. Le Builder Intelligent gère cet ordre automatiquement.


Injection de dépendances

Via les Extensions Axum, injectées automatiquement par le middleware Extensions :

// Enregistré automatiquement par le builder :
// Extension(engine)  → Arc<RuniqueEngine>
// Extension(tera)    → Arc<Tera>
// Extension(config)  → Arc<RuniqueConfig>

// Accessible dans les handlers via Request :
pub async fn handler(request: Request) -> AppResult<Response> {
    let db = request.engine.db.clone();
    let config = &request.engine.config;
    // ...
}