class Sidekiq::Middleware::Chain

Public Instance Methods

add(klass, *args) click to toggle source

Add the given middleware to the end of the chain. Sidekiq will call ‘klass.new(*args)` to create a clean copy of your middleware for every job executed.

chain.add(Statsd::Metrics, { collector: "localhost:8125" })

@param klass [Class] Your middleware class @param *args [Array<Object>] Set of arguments to pass to every instance of your middleware

# File lib/sidekiq/middleware/chain.rb, line 119
def add(klass, *args)
  remove(klass)
  entries << Entry.new(@config, klass, *args)
end
clear() click to toggle source
# File lib/sidekiq/middleware/chain.rb, line 163
def clear
  entries.clear
end
copy_for(capsule) click to toggle source
# File lib/sidekiq/middleware/chain.rb, line 99
def copy_for(capsule)
  chain = Sidekiq::Middleware::Chain.new(capsule)
  chain.instance_variable_set(:@entries, entries.dup)
  chain
end
each(&block) click to toggle source

Iterate through each middleware in the chain

# File lib/sidekiq/middleware/chain.rb, line 84
def each(&block)
  entries.each(&block)
end
empty?() click to toggle source

@return [Boolean] if the chain contains no middleware

# File lib/sidekiq/middleware/chain.rb, line 155
def empty?
  @entries.nil? || @entries.empty?
end
entries() click to toggle source
# File lib/sidekiq/middleware/chain.rb, line 95
def entries
  @entries ||= []
end
exists?(klass) click to toggle source

@return [Boolean] if the given class is already in the chain

# File lib/sidekiq/middleware/chain.rb, line 149
def exists?(klass)
  any? { |entry| entry.klass == klass }
end
Also aliased as: include?
include?(klass)
Alias for: exists?
insert_after(oldklass, newklass, *args) click to toggle source

Inserts newklass after oldklass in the chain. Useful if one middleware must run after another middleware.

# File lib/sidekiq/middleware/chain.rb, line 141
def insert_after(oldklass, newklass, *args)
  i = entries.index { |entry| entry.klass == newklass }
  new_entry = i.nil? ? Entry.new(@config, newklass, *args) : entries.delete_at(i)
  i = entries.index { |entry| entry.klass == oldklass } || entries.count - 1
  entries.insert(i + 1, new_entry)
end
insert_before(oldklass, newklass, *args) click to toggle source

Inserts newklass before oldklass in the chain. Useful if one middleware must run before another middleware.

# File lib/sidekiq/middleware/chain.rb, line 132
def insert_before(oldklass, newklass, *args)
  i = entries.index { |entry| entry.klass == newklass }
  new_entry = i.nil? ? Entry.new(@config, newklass, *args) : entries.delete_at(i)
  i = entries.index { |entry| entry.klass == oldklass } || 0
  entries.insert(i, new_entry)
end
invoke(*args) { || ... } click to toggle source

Used by Sidekiq to execute the middleware at runtime @api private

# File lib/sidekiq/middleware/chain.rb, line 169
def invoke(*args, &block)
  return yield if empty?

  chain = retrieve
  traverse(chain, 0, args, &block)
end
prepend(klass, *args) click to toggle source

Identical to {#add} except the middleware is added to the front of the chain.

# File lib/sidekiq/middleware/chain.rb, line 125
def prepend(klass, *args)
  remove(klass)
  entries.insert(0, Entry.new(@config, klass, *args))
end
remove(klass) click to toggle source

Remove all middleware matching the given Class @param klass [Class]

# File lib/sidekiq/middleware/chain.rb, line 107
def remove(klass)
  entries.delete_if { |entry| entry.klass == klass }
end
retrieve() click to toggle source
# File lib/sidekiq/middleware/chain.rb, line 159
def retrieve
  map(&:make_new)
end

Private Instance Methods

traverse(chain, index, args) { || ... } click to toggle source
# File lib/sidekiq/middleware/chain.rb, line 178
def traverse(chain, index, args, &block)
  if index >= chain.size
    yield
  else
    chain[index].call(*args) do
      traverse(chain, index + 1, args, &block)
    end
  end
end