Sha256: 6f40bd9fc71c98efafb0b9d135094e085b757aff58e89b13b9be894ca53f062c

Contents?: true

Size: 1.48 KB

Versions: 11

Compression:

Stored size: 1.48 KB

Contents

# Allows arbitrary wrapping of the job deserialization and job execution procedures
class Sqewer::MiddlewareStack
  
  # Returns the default middleware stack, which is empty (an instance of None).
  #
  # @return [MiddlewareStack] the default empty stack
  def self.default
    @instance ||= new
  end
  
  # Creates a new MiddlewareStack. Once created, handlers can be added using `:<<`
  def initialize
    @handlers = []
  end
  
  # Adds a handler. The handler should respond to :around_deserialization and #around_execution.
  #
  # @param handler[#around_deserializarion, #around_execution] The middleware item to insert
  # @return [void]
  def <<(handler)
    @handlers << handler
    # TODO: cache the wrapping proc
  end
  
  def around_execution(job, context, &inner_block)
    return yield if @handlers.empty?
    
    responders = @handlers.select{|e| e.respond_to?(:around_execution) }
    responders.reverse.inject(inner_block) {|outer_block, middleware_object|
      ->{ 
        middleware_object.public_send(:around_execution, job, context, &outer_block)
      }
    }.call
  end

  def around_deserialization(serializer, message_id, message_body, &inner_block)
    return yield if @handlers.empty?
    
    responders = @handlers.select{|e| e.respond_to?(:around_deserialization) }
    responders.reverse.inject(inner_block) {|outer_block, middleware_object|
      ->{ middleware_object.public_send(:around_deserialization, serializer, message_id, message_body, &outer_block) }
    }.call
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
sqewer-5.0.0 lib/sqewer/middleware_stack.rb
sqewer-4.2.0 lib/sqewer/middleware_stack.rb
sqewer-4.1.0 lib/sqewer/middleware_stack.rb
sqewer-4.0.1 lib/sqewer/middleware_stack.rb
sqewer-4.0.0 lib/sqewer/middleware_stack.rb
sqewer-3.0.1 lib/sqewer/middleware_stack.rb
sqewer-3.0.0 lib/sqewer/middleware_stack.rb
sqewer-2.0.2 lib/sqewer/middleware_stack.rb
sqewer-2.0.1 lib/sqewer/middleware_stack.rb
sqewer-2.0.0 lib/sqewer/middleware_stack.rb
sqewer-1.0.0 lib/sqewer/middleware_stack.rb