lib/flipper/adapters/fallback.rb in flipper-fallback-0.0.2 vs lib/flipper/adapters/fallback.rb in flipper-fallback-0.1.0

- old
+ new

@@ -1,26 +1,38 @@ require 'flipper' require 'flipper/adapters/memory' require 'delegate' +require 'timeout' module Flipper module Adapters class Fallback < SimpleDelegator - VERSION = '0.0.2' - def initialize(primary_adapter, fallback_adapter = Flipper::Adapters::Memory.new) + VERSION = '0.1.0' + + def initialize(primary_adapter, options = {}, fallback_adapter = Flipper::Adapters::Memory.new) super(primary_adapter) @primary_adapter = primary_adapter @fallback_adapter = fallback_adapter @delegate_sd_obj = primary_adapter + + @on_error = options[:on_error] || lambda do |error, primary_adapter, fallback_adapter| + STDERR.puts("[Flipper::Adapters::Fallback] Primary adapter(#{primary_adapter.inspect}) Failure! #{error}") + STDERR.puts("[Flipper::Adapters::Fallback] Falling back to #{fallback_adapter.inspect})") + end + + @timeout = options[:timeout] end def method_missing(m, *args, &block) - super - rescue => e - STDERR.puts("[Flipper::Adapters::Fallback] Primary adapter(#{@primary_adapter.inspect}) Failure! #{e}") - STDERR.puts("[Flipper::Adapters::Fallback] Falling back to #{@fallback_adapter.inspect})") - @fallback_adapter.__send__(m, *args, &block) + Timeout::timeout(@timeout) do + begin + super + rescue => error + @on_error.call(error, @primary_adapter, @fallback_adapter) + @fallback_adapter.__send__(m, *args, &block) + end + end end end end end