1
1
# frozen_string_literal: true
2
2
3
+ require_relative 'gateway/middleware'
4
+
3
5
module Datadog
4
6
module AppSec
5
7
# Instrumentation for AppSec
6
8
module Instrumentation
7
9
# Instrumentation gateway implementation
8
10
class Gateway
9
- # Instrumentation gateway middleware
10
- class Middleware
11
- attr_reader :key , :block
12
-
13
- def initialize ( key , &block )
14
- @key = key
15
- @block = block
16
- end
17
-
18
- def call ( stack , env )
19
- @block . call ( stack , env )
20
- end
21
- end
22
-
23
- private_constant :Middleware
24
-
25
11
def initialize
26
12
@middlewares = Hash . new { |h , k | h [ k ] = [ ] }
13
+ @pushed_events = { }
27
14
end
28
15
16
+ # NOTE: Be careful with pushed names because every pushed event name
17
+ # is recorded in order to provide an ability to any subscriber
18
+ # to check wether an arbitrary event had happened.
19
+ #
20
+ # WARNING: If we start pushing generated names we should consider
21
+ # limiting the storage of pushed names.
29
22
def push ( name , env , &block )
30
- block ||= -> { }
23
+ @pushed_events [ name ] = true
31
24
32
- middlewares_for_name = middlewares [ name ]
25
+ block ||= -> { }
26
+ middlewares_for_name = @middlewares [ name ]
33
27
34
28
return [ block . call , nil ] if middlewares_for_name . empty?
35
29
@@ -48,14 +42,15 @@ def push(name, env, &block)
48
42
end
49
43
50
44
def watch ( name , key , &block )
51
- @middlewares [ name ] << Middleware . new ( key , &block ) unless middlewares [ name ] . any? { |m | m . key == key }
45
+ @middlewares [ name ] << Middleware . new ( key , &block ) unless @ middlewares[ name ] . any? { |m | m . key == key }
52
46
end
53
47
54
- private
55
-
56
- attr_reader :middlewares
48
+ def pushed? ( name )
49
+ @pushed_events . key? ( name )
50
+ end
57
51
end
58
52
53
+ # NOTE: This left as-is and will be depricated soon.
59
54
def self . gateway
60
55
@gateway ||= Gateway . new # TODO: not thread safe
61
56
end
0 commit comments