Module: ActiveCrew::Responders::FayeResponder

Defined in:
lib/active_crew/responders/faye_responder.rb

Overview

ActiveCrew Faye responder.

Defined Under Namespace

Classes: FayeResponderError

Constant Summary collapse

MAX_RETRIES =
5

Class Method Summary collapse

Class Method Details

.channel(invoker, options) ⇒ Object

Returns Invoker channel name.

Returns:

  • Invoker channel name



38
39
40
# File 'lib/active_crew/responders/faye_responder.rb', line 38

def channel(invoker, options)
  options[:channel] || "/#{invoker.class.to_s.underscore}/#{invoker.id}"
end

.configObject



96
97
98
99
100
101
# File 'lib/active_crew/responders/faye_responder.rb', line 96

def config
  return @config if defined? @config

  @config = YAML.load(ERB.new(File.new(config_path).read).result)[Rails.env]
  @config = (@config || {}).symbolize_keys
end

.config_pathObject



103
104
105
# File 'lib/active_crew/responders/faye_responder.rb', line 103

def config_path
  File.join(Rails.root, 'config', 'faye.yml')
end

.headerObject

Returns Faye request header.

Returns:

  • Faye request header



76
77
78
79
80
81
82
# File 'lib/active_crew/responders/faye_responder.rb', line 76

def header
  {
    'Content-Type' => 'application/json',
    'Pragma' => 'no-cache',
    'X-Requested-With' => 'XMLHttpRequest'
  }
end

.payload(name, invoker, options, model) ⇒ Object

Returns Faye request payload.

Returns:

  • Faye request payload



43
44
45
46
47
48
49
50
51
# File 'lib/active_crew/responders/faye_responder.rb', line 43

def payload(name, invoker, options, model)
  {
    invoker: serialize_invoker(invoker),
    session: options[:session],
    command: name,
    status: status(model),
    response: serialize(model, options)
  }
end

.request(message) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/active_crew/responders/faye_responder.rb', line 21

def request(message)
  retries = 0

  begin
    validate RestClient.post url, message.to_json, header
  rescue FayeResponderError
    retries += 1

    retry if retries < MAX_RETRIES

    Rails.logger.fatal "[#{self}] #{$ERROR_INFO.message}"
  rescue Exception
    Rails.logger.fatal "[#{self}] #{$ERROR_INFO.message}"
  end
end

.respond(name, invoker, options, model) ⇒ Object

Respond with faye Respond with faye



15
16
17
18
19
# File 'lib/active_crew/responders/faye_responder.rb', line 15

def respond(name, invoker, options, model)
  request channel: channel(invoker, options),
          data: payload(name, invoker, options, model),
          ext: { publish_key: config[:publish_key] }
end

.serialize(model, options = {}) ⇒ Object

Serialize payload



58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/active_crew/responders/faye_responder.rb', line 58

def serialize(model, options = {})
  return { base: model.message } if model.is_a? CommandError

  if model.is_a?(Array) || !model.respond_to?(:errors) || model.errors.empty?
    # SerializableResource need only symbolize options
    options = options.slice(:serializer, :each_serializer).symbolize_keys
    resource = ActiveModelSerializers::SerializableResource.new model, options
    resource.adapter.respond_to?(:serializable_hash) ? resource.serializable_hash : model
  else
    ActiveModelSerializers::SerializableResource.new(model.errors, root: 'errors').serializable_hash[:errors]
  end
end

.serialize_invoker(invoker) ⇒ Object



53
54
55
# File 'lib/active_crew/responders/faye_responder.rb', line 53

def serialize_invoker(invoker)
  serialize invoker, serializer: "#{invoker.class}::InvokerSerializer".constantize
end

.status(model) ⇒ Object



71
72
73
# File 'lib/active_crew/responders/faye_responder.rb', line 71

def status(model)
  !model.is_a?(CommandError) && (!model.respond_to?(:errors) || model.errors.empty?) ? :success : :failure
end

.urlObject



92
93
94
# File 'lib/active_crew/responders/faye_responder.rb', line 92

def url
  "#{config[:ssl] ? 'https' : 'http'}://#{config[:host]}/faye"
end

.validate(response) ⇒ Object

Validate faye response



85
86
87
88
89
90
# File 'lib/active_crew/responders/faye_responder.rb', line 85

def validate(response)
  fail FayeResponderError, response.code unless response.code == 200

  response = JSON.parse(response)[0].symbolize_keys
  fail FayeResponderError, response[:error] unless response[:successful]
end