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
Source
# File lib/ably/modules/safe_deferrable.rb, line 24 def callback(&block) super do |*args| safe_deferrable_block(*args, &block) end end
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]
Source
# File lib/ably/modules/safe_deferrable.rb, line 36 def errback(&block) super do |*args| safe_deferrable_block(*args, &block) end end
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]
Source
# File lib/ably/modules/safe_deferrable.rb, line 56 def fail(*args) super(*args) end
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]
Source
# File lib/ably/modules/safe_deferrable.rb, line 47 def succeed(*args) super(*args) end
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]
Private Instance Methods
Source
# File 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
Source
# File 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