lib/web3/middleware.ex

defmodule Web3.Middleware do
  @moduledoc """
  Middleware provides an extension point to add functions that you want to be
  called for every method JSON RPC API.

  Implement the `Web3.Middleware` behaviour in your module and define the
  `c:before_dispatch/1`, `c:after_dispatch/1`, and `c:after_failure/1` callback
  functions.

  Middleware inspired by

    - [Commanded](https://github.com/commanded/commanded)
    - [Absinthe](https://github.com/absinthe-graphql/absinthe)

  ## Example middleware

      defmodule NoOpMiddleware do
        @behaviour Web3.Middleware

        alias Web3.Middleware.Pipeline
        import Pipeline

        def before_dispatch(%Pipeline{method: method} = pipeline) do
          pipeline
        end

        def after_dispatch(%Pipeline{method: method} = pipeline) do
          pipeline
        end

        def after_failure(%Pipeline{method: method} = pipeline) do
          pipeline
        end
      end

  Import the `Web3.Middleware.Pipeline` module to access convenience
  functions.

    * `assign/3` - puts a key and value into the `assigns` map
    * `halt/1` - stops execution of further middleware downstream and prevents
      dispatch of the method when used in a `before_dispatch` callback

  """

  alias Web3.Middleware.Pipeline

  @type pipeline :: %Pipeline{}

  @callback before_dispatch(pipeline) :: pipeline
  @callback after_dispatch(pipeline) :: pipeline
  @callback after_failure(pipeline) :: pipeline
end