Class: Bugsnag::MiddlewareStack
- Inherits:
-
Object
- Object
- Bugsnag::MiddlewareStack
- Defined in:
- lib/bugsnag/middleware_stack.rb
Instance Method Summary collapse
- #disable(*middlewares) ⇒ Object
-
#initialize ⇒ MiddlewareStack
constructor
A new instance of MiddlewareStack.
- #insert_after(after, new_middleware) ⇒ Object
- #insert_before(before, new_middleware) ⇒ Object
-
#method_missing(method, *args, &block) ⇒ Object
This allows people to proxy methods to the array if they want to do more complex stuff.
-
#run(notification) ⇒ Object
Runs the middleware stack and calls.
- #use(new_middleware) ⇒ Object
Constructor Details
#initialize ⇒ MiddlewareStack
Returns a new instance of MiddlewareStack.
3 4 5 6 7 |
# File 'lib/bugsnag/middleware_stack.rb', line 3 def initialize @middlewares = [] @disabled_middleware = [] @mutex = Mutex.new end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args, &block) ⇒ Object
This allows people to proxy methods to the array if they want to do more complex stuff
61 62 63 |
# File 'lib/bugsnag/middleware_stack.rb', line 61 def method_missing(method, *args, &block) @middlewares.send(method, *args, &block) end |
Instance Method Details
#disable(*middlewares) ⇒ Object
52 53 54 55 56 57 58 |
# File 'lib/bugsnag/middleware_stack.rb', line 52 def disable(*middlewares) @mutex.synchronize do @disabled_middleware += middlewares @middlewares.delete_if {|m| @disabled_middleware.include?(m)} end end |
#insert_after(after, new_middleware) ⇒ Object
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/bugsnag/middleware_stack.rb', line 18 def insert_after(after, new_middleware) @mutex.synchronize do return if @disabled_middleware.include?(new_middleware) return if @middlewares.include?(new_middleware) if after.is_a? Array index = @middlewares.rindex {|el| after.include?(el)} else index = @middlewares.rindex(after) end if index.nil? @middlewares << new_middleware else @middlewares.insert index + 1, new_middleware end end end |
#insert_before(before, new_middleware) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/bugsnag/middleware_stack.rb', line 37 def insert_before(before, new_middleware) @mutex.synchronize do return if @disabled_middleware.include?(new_middleware) return if @middlewares.include?(new_middleware) if before.is_a? Array index = @middlewares.index {|el| before.include?(el)} else index = @middlewares.index(before) end @middlewares.insert index || @middlewares.length, new_middleware end end |
#run(notification) ⇒ Object
Runs the middleware stack and calls
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/bugsnag/middleware_stack.rb', line 66 def run(notification) # The final lambda is the termination of the middleware stack. It calls deliver on the notification lambda_has_run = false notify_lambda = lambda do |notif| lambda_has_run = true yield if block_given? end begin # We reverse them, so we can call "call" on the first middleware middleware_procs.reverse.inject(notify_lambda) { |n,e| e.call(n) }.call(notification) rescue StandardError => e # KLUDGE: Since we don't re-raise middleware exceptions, this breaks rspec raise if e.class.to_s == "RSpec::Expectations::ExpectationNotMetError" # We dont notify, as we dont want to loop forever in the case of really broken middleware, we will # still send this notify Bugsnag.warn "Bugsnag middleware error: #{e}" Bugsnag.log "Middleware error stacktrace: #{e.backtrace.inspect}" end # Ensure that the deliver has been performed, and no middleware has botched it notify_lambda.call(notification) unless lambda_has_run end |
#use(new_middleware) ⇒ Object
9 10 11 12 13 14 15 16 |
# File 'lib/bugsnag/middleware_stack.rb', line 9 def use(new_middleware) @mutex.synchronize do return if @disabled_middleware.include?(new_middleware) return if @middlewares.include?(new_middleware) @middlewares << new_middleware end end |