Class: RailsRenderService::Renderer

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_render_service/renderer.rb

Class Method Summary collapse

Class Method Details

.clientObject



18
19
20
# File 'lib/rails_render_service/renderer.rb', line 18

def self.client
  NetX::HTTPUnix.new server_uri
end

.has_template(key) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/rails_render_service/renderer.rb', line 34

def self.has_template(key)
  with_retry do
    req = Net::HTTP::Get.new "/#{key}"
    res = client.request req
    case res.code
    when '200' then true
    when '404' then false
    else
      puts res.body
      raise "Attempt to find `#{key}` resulted in an error response from the rendering service"
    end
  end
end

.render_template(json) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/rails_render_service/renderer.rb', line 48

def self.render_template(json)
  with_retry do
    req = Net::HTTP::Post.new "/", initheader = {'Content-Type'=>'application/json'}
    req.body = json
    res = client.request req
    case res.code
    when '200' then res.body
    when '404' then raise "Missing React template for `#{JSON.parse(req.body)['name']}`"
    else
      puts res.body
      raise "Attempt to render `#{JSON.parse(req.body)['name']}` resulted in an error response from the rendering service"
    end
  end
end

.server_uriObject

def self.start

pid = spawn("NODE_ENV=#{Rails.env} npm run #{Rails.env}")
trap('TERM') do
  kill pid
  shutdown()
end

end



14
15
16
# File 'lib/rails_render_service/renderer.rb', line 14

def self.server_uri
  @@server_uri ||= Rails.application.config.rails_render_service.get_uri.call
end

.with_retry(backoff_times = [0.2, 0.5, 1, 2, 3, 4, 5], &block) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
# File 'lib/rails_render_service/renderer.rb', line 22

def self.with_retry(backoff_times = [0.2, 0.5, 1, 2, 3, 4, 5], &block)
  begin
    yield block
  rescue Errno::ECONNREFUSED, Errno::ENOENT => e
    raise e if backoff_times.empty?
    backoff_time = backoff_times.shift
    puts "Waiting for render service. Retry in #{backoff_time}s..."
    sleep backoff_time
    retry
  end
end