Sha256: b86d44b3104a218c243ce7575e7061fbc6131ba035c99fb7ec7cd4dca953e128

Contents?: true

Size: 1.4 KB

Versions: 37

Compression:

Stored size: 1.4 KB

Contents

module Ably::Modules
  # SafeYield provides the method safe_yield that will yield to the consumer
  # who provided a block, however any exceptions will be caught, logged, and
  # operation of the client library will continue.
  #
  # An exception in a callback provided by a developer should not break this client library
  # and stop further execution of code.
  #
  # @note this Module requires that the method #logger is available
  #
  # @api private
  module SafeYield
    private

    def safe_yield(block, *args)
      block.call(*args)
    rescue StandardError => e
      message = "An exception in an external block was caught. #{e.class}: #{e.message}\n#{e.backtrace.join("\n")}"
      safe_yield_log_error message
    end

    def safe_yield_log_error(message)
      if defined?(:logger) && logger.respond_to?(:error)
        return logger.error message
      end
    rescue StandardError
      fallback_logger.error message
    end

    def fallback_logger
      @fallback_logger ||= ::Logger.new(STDOUT).tap do |logger|
        logger.formatter = lambda do |severity, datetime, progname, msg|
          [
            "#{datetime.strftime("%Y-%m-%d %H:%M:%S.%L")} #{::Logger::SEV_LABEL[severity]} #{msg}",
            "Warning: SafeYield expects the method #logger to be defined in the class it is included in, the method was not found in #{self.class}"
          ].join("\n")
        end
      end
    end
  end
end

Version data entries

37 entries across 37 versions & 2 rubygems

Version Path
ably-rest-1.1.5 lib/submodules/ably-ruby/lib/ably/modules/safe_yield.rb
ably-1.1.5 lib/ably/modules/safe_yield.rb
ably-rest-1.1.4 lib/submodules/ably-ruby/lib/ably/modules/safe_yield.rb
ably-1.1.4 lib/ably/modules/safe_yield.rb
ably-rest-1.1.4.rc lib/submodules/ably-ruby/lib/ably/modules/safe_yield.rb
ably-1.1.4.rc lib/ably/modules/safe_yield.rb
ably-rest-1.1.3 lib/submodules/ably-ruby/lib/ably/modules/safe_yield.rb
ably-1.1.3 lib/ably/modules/safe_yield.rb
ably-rest-1.1.2 lib/submodules/ably-ruby/lib/ably/modules/safe_yield.rb
ably-1.1.2 lib/ably/modules/safe_yield.rb
ably-rest-1.1.2.rc1 lib/submodules/ably-ruby/lib/ably/modules/safe_yield.rb
ably-1.1.1 lib/ably/modules/safe_yield.rb
ably-rest-1.1.0 lib/submodules/ably-ruby/lib/ably/modules/safe_yield.rb
ably-1.1.0 lib/ably/modules/safe_yield.rb
ably-1.0.7 lib/ably/modules/safe_yield.rb
ably-rest-1.0.6 lib/submodules/ably-ruby/lib/ably/modules/safe_yield.rb
ably-1.0.6 lib/ably/modules/safe_yield.rb