class Acfs::Service::Middleware::Stack

Constants

IDENTITY
MUTEX

Attributes

middlewares[R]

Public Class Methods

new() click to toggle source
# File lib/acfs/service/middleware/stack.rb, line 14
def initialize
  @middlewares = []
end

Public Instance Methods

build(app = IDENTITY) click to toggle source
# File lib/acfs/service/middleware/stack.rb, line 34
def build(app = IDENTITY)
  middlewares.reverse.inject(app) do |next_middleware, current_middleware|
    klass, args, block = current_middleware
    args ||= []

    if klass.is_a?(Class)
      klass.new(next_middleware, *args, &block)
    elsif klass.respond_to?(:call)
      lambda do |env|
        next_middleware.call(klass.call(env, *args))
      end
    else
      raise "Invalid middleware, doesn't respond to `call`: #{klass.inspect}"
    end
  end
end
build!() click to toggle source
# File lib/acfs/service/middleware/stack.rb, line 24
def build!
  return if @app

  MUTEX.synchronize do
    return if @app

    @app = build
  end
end
call(request) click to toggle source
# File lib/acfs/service/middleware/stack.rb, line 18
def call(request)
  build! unless @app

  @app.call request
end
clear() click to toggle source
# File lib/acfs/service/middleware/stack.rb, line 59
def clear
  middlewares.clear
end
each() { |first| ... } click to toggle source
# File lib/acfs/service/middleware/stack.rb, line 55
def each
  middlewares.each {|x| yield x.first }
end
insert(index, klass, *args, &block) click to toggle source
# File lib/acfs/service/middleware/stack.rb, line 51
def insert(index, klass, *args, &block)
  middlewares.insert(index, [klass, args, block])
end