Class: Datadog::AppSec::Instrumentation::Gateway

Inherits:
Object
  • Object
show all
Defined in:
lib/datadog/appsec/instrumentation/gateway.rb,
lib/datadog/appsec/instrumentation/gateway/argument.rb,
lib/datadog/appsec/instrumentation/gateway/middleware.rb

Overview

Instrumentation gateway implementation

Defined Under Namespace

Classes: Argument, Middleware, User

Instance Method Summary collapse

Constructor Details

#initializeGateway

Returns a new instance of Gateway.



11
12
13
14
# File 'lib/datadog/appsec/instrumentation/gateway.rb', line 11

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

Instance Method Details

#push(name, env, &block) ⇒ Object

NOTE: Be careful with pushed names because every pushed event name

is recorded in order to provide an ability to any subscriber
to check wether an arbitrary event had happened.

WARNING: If we start pushing generated names we should consider

limiting the storage of pushed names.


22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/datadog/appsec/instrumentation/gateway.rb', line 22

def push(name, env, &block)
  @pushed_events[name] = true

  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

#pushed?(name) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/datadog/appsec/instrumentation/gateway.rb', line 48

def pushed?(name)
  @pushed_events.key?(name)
end

#watch(name, key, &block) ⇒ Object



44
45
46
# File 'lib/datadog/appsec/instrumentation/gateway.rb', line 44

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