Class: Datadog::AppSec::Instrumentation::Gateway
- Inherits:
-
Object
- Object
- Datadog::AppSec::Instrumentation::Gateway
- 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
-
#initialize ⇒ Gateway
constructor
A new instance of Gateway.
-
#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.
- #pushed?(name) ⇒ Boolean
- #watch(name, key, &block) ⇒ Object
Constructor Details
#initialize ⇒ Gateway
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
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 |