Expand description
Middleware system for request/response processing.
This module provides a flexible middleware chain system that allows you to intercept and process WebSocket messages before they reach handlers. Middleware can modify messages, perform authentication, logging, rate limiting, and more.
§Overview
The middleware system is built around three core types:
Middleware- Trait that all middleware must implementMiddlewareChain- Container that holds and executes middleware in orderNext- Represents the next step in the middleware chain
§Architecture
Message → Middleware 1 → Middleware 2 → ... → Handler → Response
↓ ↓ ↓
Next::run Next::run Handler::callEach middleware can:
- Inspect the incoming message
- Modify the message before passing it forward
- Short-circuit the chain by not calling
next.run() - Modify the response after calling
next.run() - Handle errors and transform responses
§Examples
§Using Built-in Logger Middleware
use wsforge::prelude::*;
async fn echo(msg: Message) -> Result<Message> {
Ok(msg)
}
let router = Router::new()
.layer(LoggerMiddleware::new())
.default_handler(handler(echo));
router.listen("127.0.0.1:8080").await?;§Creating Custom Middleware
use wsforge::prelude::*;
use async_trait::async_trait;
struct AuthMiddleware {
secret: String,
}
#[async_trait]
impl Middleware for AuthMiddleware {
async fn handle(
&self,
message: Message,
conn: Connection,
state: AppState,
extensions: Extensions,
mut next: Next,
) -> Result<Option<Message>> {
// Check for auth token in message
if let Some(text) = message.as_text() {
if !text.contains(&self.secret) {
return Err(Error::custom("Unauthorized"));
}
}
// Continue to next middleware/handler
next.run(message, conn, state, extensions).await
}
}§Function-based Middleware
use wsforge::prelude::*;
let logging_middleware = from_fn(|msg, conn, state, ext, mut next| async move {
println!("Before handler: {:?}", msg.as_text());
let response = next.run(msg, conn, state, ext).await?;
println!("After handler");
Ok(response)
});
// Use in router
// router.layer(logging_middleware);§Chaining Multiple Middleware
use wsforge::prelude::*;
let router = Router::new()
.layer(LoggerMiddleware::new())
.layer(auth_middleware())
.layer(rate_limit_middleware())
.default_handler(handler(my_handler));Re-exports§
pub use logger::LoggerMiddleware;
Modules§
- logger
- Logger middleware for request/response logging.
Structs§
- FnMiddleware
- Function-based Middleware
- Middleware
Chain - Middleware chain holds all middlewares and the final handler.
- Next
- Represents the next middleware or handler in the chain.
Traits§
- Middleware
- Middleware trait that all middleware must implement.
Functions§
- from_fn
- Helper function to create middleware from async functions.