Behaviour for pluggable message-processing middleware.
Middleware modules intercept messages as they flow into consumer handlers, allowing cross-cutting concerns (logging, metrics, tracing, auth) to be composed without modifying handler logic.
Interface
defmodule MyApp.AuthMiddleware do
@behaviour PhoenixMicro.Middleware
@impl PhoenixMicro.Middleware
def call(%PhoenixMicro.Message{} = message, next) do
if authorized?(message.headers) do
next.(message)
else
{:error, :unauthorized}
end
end
endComposing middleware
Middleware is specified on a consumer using the middleware/1 macro:
defmodule MyConsumer do
use PhoenixMicro.Consumer
topic "payments.*"
middleware [MyApp.AuthMiddleware, PhoenixMicro.Middleware.Logger]
endMiddleware is executed left to right (outermost first).
Summary
Types
@type next() :: (PhoenixMicro.Message.t() -> :ok | {:error, term()})
Callbacks
@callback call(PhoenixMicro.Message.t(), next()) :: :ok | {:error, term()}