class Datadog::AppSec::Instrumentation::Gateway

Instrumentation gateway implementation

def initialize

def initialize
  @middlewares = Hash.new { |h, k| h[k] = [] }
end

def push(name, env, &block)

def push(name, env, &block)
  block ||= -> {}
  middlewares_for_name = middlewares[name]
  return [block.call, nil] if middlewares_for_name.empty?
  wrapped = lambda do |_env|
    [block.call, nil]
  end
  # TODO: handle exceptions, except for wrapped
  stack = middlewares_for_name.reverse.reduce(wrapped) do |next_, middleware|
    lambda do |env_|
      middleware.call(next_, env_)
    end
  end
  stack.call(env)
end

def watch(name, key, &block)

def watch(name, key, &block)
  @middlewares[name] << Middleware.new(key, &block) unless middlewares[name].any? { |m| m.key == key }
end