module Ably::Modules::SafeDeferrable

SafeDeferrable module provides an EventMachine::Deferrable interface to the object it is included in and is safe to use for for public interfaces of this client library. Any exceptions raised in the success or failure callbacks are caught and logged to logger

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

See www.rubydoc.info/gems/eventmachine/1.0.7/EventMachine/Deferrable

Public Instance Methods

callback(&block) click to toggle source

Specify a block to be executed if and when the Deferrable object receives a status of :succeeded. See www.rubydoc.info/gems/eventmachine/1.0.7/EventMachine/Deferrable#callback-instance_method

@return [void]

Calls superclass method
# File lib/submodules/ably-ruby/lib/ably/modules/safe_deferrable.rb, line 24
def callback(&block)
  super do |*args|
    safe_deferrable_block(*args, &block)
  end
end
errback(&block) click to toggle source

Specify a block to be executed if and when the Deferrable object receives a status of :failed. See www.rubydoc.info/gems/eventmachine/1.0.7/EventMachine/Deferrable#errback-instance_method

@return [void]

Calls superclass method
# File lib/submodules/ably-ruby/lib/ably/modules/safe_deferrable.rb, line 36
def errback(&block)
  super do |*args|
    safe_deferrable_block(*args, &block)
  end
end
fail(*args) click to toggle source

Mark the Deferrable as failed and trigger all error callbacks. See www.rubydoc.info/gems/eventmachine/1.0.7/EventMachine/Deferrable#fail-instance_method

@return [void]

Calls superclass method
# File lib/submodules/ably-ruby/lib/ably/modules/safe_deferrable.rb, line 56
def fail(*args)
  super(*args)
end
succeed(*args) click to toggle source

Mark the Deferrable as succeeded and trigger all success callbacks. See www.rubydoc.info/gems/eventmachine/1.0.7/EventMachine/Deferrable#succeed-instance_method

@return [void]

Calls superclass method
# File lib/submodules/ably-ruby/lib/ably/modules/safe_deferrable.rb, line 47
def succeed(*args)
  super(*args)
end

Private Instance Methods

fallback_logger() click to toggle source
# File lib/submodules/ably-ruby/lib/ably/modules/safe_deferrable.rb, line 72
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: SafeDeferrable 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
safe_deferrable_block(*args) { |*args| ... } click to toggle source
# File lib/submodules/ably-ruby/lib/ably/modules/safe_deferrable.rb, line 61
def safe_deferrable_block(*args)
  yield(*args)
rescue StandardError => e
  message = "An exception in a Deferrable callback was caught. #{e.class}: #{e.message}\n#{e.backtrace.join("\n")}"
  if defined?(:logger) && logger.respond_to?(:error)
    logger.error message
  else
    fallback_logger.error message
  end
end