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
more...

Overview

Instrumentation gateway implementation

Defined Under Namespace

Classes: Argument, Middleware, User

Instance Method Summary collapse

Constructor Details

#initializeGateway

Returns a new instance of Gateway.

[View source]

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.
[View source]

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)
[View source]

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

[View source]

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