Sha256: bdae0ed166fc457c718a816a7cd4a82a8153cb9f5885a150d0a088d68b215a34

Contents?: true

Size: 1.97 KB

Versions: 4

Compression:

Stored size: 1.97 KB

Contents

module Sidekiq
  # Middleware is code configured to run before/after
  # a message is processed.  It is patterned after Rack
  # middleware. Middleware exists for the client side
  # (pushing jobs onto the queue) as well as the server
  # side (when jobs are actually processed).
  #
  # To add middleware for the client:
  #
  # Sidekiq.client_middleware do |chain|
  #   chain.add MyClientHook
  # end
  #
  # To modify middleware for the server, just call
  # with another block:
  #
  # Sidekiq.server_middleware do |chain|
  #   chain.add MyServerHook
  #   chain.remove ActiveRecord
  # end
  #
  # This is an example of a minimal server middleware:
  #
  # class MyServerHook
  #   def call(worker, msg, queue)
  #     puts "Before work"
  #     yield
  #     puts "After work"
  #   end
  # end
  #
  # This is an example of a minimal client middleware:
  #
  # class MyClientHook
  #   def call(msg, queue)
  #     puts "Before push"
  #     yield
  #     puts "After push"
  #   end
  # end
  #
  module Middleware
    class Chain
      attr_reader :entries

      def initialize
        @entries = []
        yield self if block_given?
      end

      def remove(klass)
        entries.delete_if { |entry| entry.klass == klass }
      end

      def add(klass, *args)
        entries << Entry.new(klass, *args) unless exists?(klass)
      end

      def exists?(klass)
        entries.any? { |entry| entry.klass == klass }
      end

      def retrieve
        entries.map(&:make_new)
      end

      def invoke(*args, &final_action)
        chain = retrieve.dup
        traverse_chain = lambda do
          if chain.empty?
            final_action.call
          else
            chain.shift.call(*args, &traverse_chain)
          end
        end
        traverse_chain.call
      end
    end

    class Entry
      attr_reader :klass
      def initialize(klass, *args)
        @klass = klass
        @args  = args
      end

      def make_new
        @klass.new(*@args)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
sidekiq-0.9.1 lib/sidekiq/middleware/chain.rb
sidekiq-0.9.0 lib/sidekiq/middleware/chain.rb
sidekiq-0.8.0 lib/sidekiq/middleware/chain.rb
sidekiq-0.7.0 lib/sidekiq/middleware/chain.rb