class Jackal::Callback

Jackal customized callback

Attributes

formatters[R]

@return [Array<Formatter>] formatters applied on complete

pre_formatters[R]

@return [Array<Formatter>] formatters applied prior

Public Class Methods

new(*_) click to toggle source

Create new instance

@return [self]

Calls superclass method
# File lib/jackal/callback.rb, line 26
def initialize(*_)
  super
  if(service_config[:formatters])
    setup_formatters
  end
end

Public Instance Methods

apply_formatters!(payload) click to toggle source

Apply configured formatters to payload

@param payload [Smash] @return [Smash]

# File lib/jackal/callback.rb, line 171
def apply_formatters!(payload)
  formatters.each do |formatter|
    begin
      formatter.format(payload)
    rescue => e
      error "Formatter error encountered (<#{formatter}>): #{e.class} - #{e}"
    end
  end
end
asset_store() click to toggle source

@return [Jackal::Assets::Store] @note the assets library is NOT a dependency of jackal and must

be included at runtime!
# File lib/jackal/callback.rb, line 60
def asset_store
  memoize(:asset_store) do
    require 'jackal-assets'
    Jackal::Assets::Store.new
  end
end
completed(payload, message) click to toggle source

Mark payload complete and forward

@param payload [Hash] @param message [Carnivore::Message]

# File lib/jackal/callback.rb, line 129
def completed(payload, message)
  message.confirm!
  info "Processing of #{message} complete on this callback"
  forward(payload, source.name)
end
failed(payload, message, reason='No reason provided') click to toggle source

Send payload to error handler

@param payload [Hash] @param message [Carnivore::Message] @param reason [String]

# File lib/jackal/callback.rb, line 105
def failed(payload, message, reason='No reason provided')
  error "Processing of #{message} failed! Reason: #{reason}"
  unless(payload[:error])
    payload.set(:error, reason)
  end
  message.confirm!
  dest = destination(:error, payload)
  source = Carnivore::Supervisor.supervisor[dest]
  if(source)
    if(formatters)
      apply_formatters!(payload)
    end
    error "Sending #{message} to error handler: #{source}"
    source.transmit(payload)
  else
    error "No error source found for generated source path: #{dest}"
    info "Processing of message #{message} has completed. Message now discarded."
  end
end
failure_wrap(message) { |payload| ... } click to toggle source

Executes block and catches unexpected exceptions if encountered

@param message [Carnivore::Message] @return [Object]

# File lib/jackal/callback.rb, line 87
def failure_wrap(message)
  abort 'Failure wrap requires block for execution' unless block_given?
  begin
    payload = unpack(message)
    yield payload
  rescue => e
    error "!!! Unexpected failure encountered -> #{e.class}: #{e}"
    debug "#{e.class}: #{e}\n#{(e.backtrace || []).join("\n")}"
    payload.set(:error, "#{e.class}: #{e.message}")
    failed(payload, message, e.message)
  end
end
forward(payload, dest=nil) click to toggle source

Forward payload to output source

@param payload [Hash]

# File lib/jackal/callback.rb, line 138
def forward(payload, dest=nil)
  unless(dest)
    dest = destination(:output, payload)
  end
  source = Carnivore::Supervisor.supervisor[dest]
  if(source)
    if(formatters)
      apply_formatters!(payload)
    end
    info "Forwarding payload to output destination... (#{source})"
    debug "Forwarded payload: #{payload.pretty_inspect}"
    source.transmit(payload)
  else
    warn "No destination source found for generated source path: #{dest}"
    info "Processing of message has completed. Message now discarded."
  end
end
job_completed(name, payload, message) click to toggle source

Mark job as completed

@param name [String] @param payload [Hash] @param message [Carnivore::Message]

# File lib/jackal/callback.rb, line 161
def job_completed(name, payload, message)
  info "Processing of message #{message} has completed within this component #{name}"
  message.confirm!
  forward(payload)
end
process_manager() click to toggle source

@return [Utils::Process]

# File lib/jackal/callback.rb, line 68
def process_manager
  memoize(:process_manager) do
    Utils::Process.new(app_config.fetch(:process_manager, Smash.new))
  end
end
setup_formatters() click to toggle source

Initialize any required formatters

@return [TrueClass, FalseClass]

# File lib/jackal/callback.rb, line 36
def setup_formatters
  f_config = service_config[:formatters]
  case f_config
  when Hash
    @formatters = f_config.fetch(:pre, []).map do |klass_name|
      constantize(klass_name).new(self)
    end
    @pre_formatters = f_config.fetch(:post, []).map do |klass_name|
      constantize(klass_name).new(self)
    end
  when Array
    @formatters = f_config.map do |klass_name|
      constantize(klass_name).new(self)
    end
    @pre_formatters = []
  else
    error "Formatters configuration error. Unable to process type `#{f_config.class}`."
    false
  end
end
valid?(message) { |m| ... } click to toggle source

Validity of message

@param message [Carnivore::Message] @return [TrueClass, FalseClass]

# File lib/jackal/callback.rb, line 78
def valid?(message)
  m = unpack(message)
  block_given? ? yield(m) : true
end