# `PhoenixMicro.Middleware`
[🔗](https://github.com/iamkanishka/phoenix_micro/blob/v1.0.0/lib/phoenix_micro/middleware.ex#L1)

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
    end

## Composing 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]
    end

Middleware is executed **left to right** (outermost first).

# `next`

```elixir
@type next() :: (PhoenixMicro.Message.t() -&gt; :ok | {:error, term()})
```

# `call`

```elixir
@callback call(PhoenixMicro.Message.t(), next()) :: :ok | {:error, term()}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
