class RailsRenderService::Renderer

Public Class Methods

client() click to toggle source
# File lib/rails_render_service/renderer.rb, line 18
def self.client
  NetX::HTTPUnix.new server_uri
end
has_template(key) click to toggle source
# 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) click to toggle source
# 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_uri() click to toggle source

def self.start

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

end

# 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| ... } click to toggle source
# 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