better_auth_core/middleware/
mod.rs1pub mod body_limit;
2pub mod cors;
3pub mod csrf;
4pub mod rate_limit;
5
6use crate::error::AuthResult;
7use crate::types::{AuthRequest, AuthResponse};
8use async_trait::async_trait;
9
10#[async_trait]
15pub trait Middleware: Send + Sync {
16 fn name(&self) -> &'static str;
18
19 async fn before_request(&self, req: &AuthRequest) -> AuthResult<Option<AuthResponse>>;
24
25 async fn after_request(
30 &self,
31 _req: &AuthRequest,
32 response: AuthResponse,
33 ) -> AuthResult<AuthResponse> {
34 Ok(response)
35 }
36}
37
38pub async fn run_before(
42 middlewares: &[Box<dyn Middleware>],
43 req: &AuthRequest,
44) -> AuthResult<Option<AuthResponse>> {
45 for mw in middlewares {
46 if let Some(response) = mw.before_request(req).await? {
47 return Ok(Some(response));
48 }
49 }
50 Ok(None)
51}
52
53pub async fn run_after(
55 middlewares: &[Box<dyn Middleware>],
56 req: &AuthRequest,
57 mut response: AuthResponse,
58) -> AuthResult<AuthResponse> {
59 for mw in middlewares.iter().rev() {
60 response = mw.after_request(req, response).await?;
61 }
62 Ok(response)
63}
64
65pub use body_limit::{BodyLimitConfig, BodyLimitMiddleware};
66pub use cors::{CorsConfig, CorsMiddleware};
67pub use csrf::{CsrfConfig, CsrfMiddleware};
68pub use rate_limit::{EndpointRateLimit, RateLimitConfig, RateLimitMiddleware};