# Middleware Changes in Sidekiq 7.0

With the internal refactoring coming in Sidekiq 7.0 it is necessary
to make minor changes to the Middleware API.

> tl;dr - middleware should now include Sidekiq::ClientMiddleware or Sidekiq::ServerMiddleware.

Currently the middleware API looks like this:

## Existing Client API

Client middleware is run when pushing a job to Redis.

```ruby
class Client
  def initialize(optional_args)
    @args = optional_args
  end
  def call(worker, job, queue, redis_pool)
    yield
  end
end

Sidekiq.configure_client do |config|
  config.client_middleware do |chain|
    chain.add Client, optional_args
  end
end
```

## Server

Server middleware is run around job execution.

```ruby
class Server
  def initialize(optional_args)
    @args = optional_args
  end
  def call(worker, job, queue)
    Sidekiq.redis {|c| c.do_something }
    Sidekiq.logger.info { "Some message" }
    yield
  end
end

Sidekiq.configure_server do |config|
  config.server_middleware do |chain|
    chain.add Server, optional_args
  end
end
```

## Updated API

The updated middleware API requires the middleware class to include
a helper module.

```ruby
class Client
  include Sidekiq::ClientMiddleware

  def initialize(optional_args)
    @args = optional_args
  end
  def call(worker, job, queue, redis_pool)
    yield
  end
end
```

```ruby
class Server
  include Sidekiq::ServerMiddleware

  def initialize(optional_args)
    @args = optional_args
  end
  def call(worker, job, queue)
    # note we no longer need to use the global Sidekiq module
    # to access Redis and the logger
    redis {|c| c.do_something }
    logger.info { "Some message" }
    yield
  end
end
```