Skip to main content

Middleware

Trait Middleware 

Source
pub trait Middleware: Send + Sync {
    // Required methods
    fn name(&self) -> &str;
    fn handle<'life0, 'async_trait>(
        &'life0 self,
        message: ReceivedMessage<Value>,
        next: Box<dyn MessageHandler>,
    ) -> Pin<Box<dyn Future<Output = Result<MiddlewareResult, WorkerError>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
}
Expand description

Middleware that wraps message handlers to add cross-cutting concerns.

Middleware forms a chain where each piece can:

  • Modify messages before passing them along
  • Perform actions before and after processing
  • Short-circuit the chain by returning early
  • Handle errors and implement retry logic
  • Signal whether acknowledgment was handled

§Example

use foxtive_worker::middleware::{Middleware, MessageHandler, MiddlewareResult};
use foxtive_worker::{ReceivedMessage, WorkerError};

struct LoggingMiddleware;

#[async_trait::async_trait]
impl Middleware for LoggingMiddleware {
    fn name(&self) -> &str { "logging" }
     
    async fn handle(
        &self,
        message: ReceivedMessage<serde_json::Value>,
        next: Box<dyn MessageHandler>,
    ) -> Result<MiddlewareResult, WorkerError> {
        println!("Processing message: {}", message.message.id);
        let result = next.handle(message).await?;
        println!("Message processed with result: {:?}", result);
        Ok(result)
    }
}

Required Methods§

Source

fn name(&self) -> &str

Get the name of this middleware for debugging and logging.

Source

fn handle<'life0, 'async_trait>( &'life0 self, message: ReceivedMessage<Value>, next: Box<dyn MessageHandler>, ) -> Pin<Box<dyn Future<Output = Result<MiddlewareResult, WorkerError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Process a message with access to the next handler in the chain.

§Arguments
  • message - The message to process
  • next - The next handler in the middleware chain
§Returns
  • Ok(MiddlewareResult::Acknowledged) if middleware handled acknowledgment
  • Ok(MiddlewareResult::Continue) if processing should continue normally
  • Err(WorkerError) if processing failed

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§