class Flyyer::FlyyerRender

Attributes

deck[RW]
extension[RW]
meta[RW]
secret[RW]
strategy[RW]
template[RW]
tenant[RW]
variables[RW]
version[RW]

Public Class Methods

create(&block) click to toggle source
# File lib/flyyer.rb, line 93
def self.create(&block)
  self.new(&block)
end
new(tenant = nil, deck = nil, template = nil, version = nil, extension = nil, variables = {}, meta = {}, secret = nil, strategy = nil) { |self| ... } click to toggle source
# File lib/flyyer.rb, line 97
def initialize(tenant = nil, deck = nil, template = nil, version = nil, extension = nil, variables = {}, meta = {}, secret = nil, strategy = nil)
  @tenant = tenant
  @deck = deck
  @template = template
  @version = version
  @extension = extension
  @variables = variables || {}
  @meta = meta
  @secret = secret
  @strategy = strategy
  yield(self) if block_given?
end

Public Instance Methods

href() click to toggle source

Create a flyyer.io string. If you are on Ruby on Rails please use .html_safe when rendering this string into the HTML

# File lib/flyyer.rb, line 157
def href
  raise Error.new('Missing "tenant" property') if @tenant.nil?
  raise Error.new('Missing "deck" property') if @deck.nil?
  raise Error.new('Missing "template" property') if @template.nil?
  raise Error.new('Got `secret` but missing `strategy`.  Valid options are `HMAC` or `JWT`.') if @secret && @strategy.nil?
  raise Error.new('Got `strategy` but missing `secret`. You can find it in your project in Advanced settings.') if @strategy && @secret.nil?
  raise Error.new('Invalid signing `strategy`. Valid options are `HMAC` or `JWT`.') if @strategy && @strategy.downcase != "jwt" && @strategy.downcase != "hmac"

  base_href = "https://cdn.flyyer.io/render/v2/#{@tenant}"

  if @strategy and @strategy.downcase == "jwt"
    return "#{base_href}?#{self.querystring}"
  end

  final_href = "#{base_href}/#{@deck}/#{@template}"
  final_href << ".#{@version}" if @version
  final_href << ".#{@extension}" if @extension
  final_href << "?#{self.querystring}"
end
querystring() click to toggle source
# File lib/flyyer.rb, line 110
def querystring
  # Allow accesing the keys of @meta with symbols and strings
  # https://stackoverflow.com/a/10786575
  @meta.default_proc = proc do |h, k|
    case k
      when String then sym = k.to_sym; h[sym] if h.key?(sym)
      when Symbol then str = k.to_s; h[str] if h.key?(str)
    end
  end

  default_v = {__v: @meta[:v].nil? ? Time.now.to_i : @meta[:v]} # This forces crawlers to refresh the image
  defaults = {
    __id: @meta[:id] || nil,
    _w: @meta[:width] || nil,
    _h: @meta[:height] || nil,
    _res: @meta[:resolution] || nil,
    _ua: @meta[:agent] || nil,
  }
  if @strategy && @secret
    key = @secret
    if @strategy.downcase == "hmac"
      default_query = FlyyerHash.new([defaults, @variables].inject(&:merge)).to_query
      puts [@deck, @template, @version || "", @extension || "", default_query].join("#")
      data = [@deck, @template, @version || "", @extension || "", default_query].join("#")
      __hmac = OpenSSL::HMAC.hexdigest('SHA256', key, data)[0..15]
      return FlyyerHash.new([defaults, default_v, @variables, {__hmac: __hmac}].inject(&:merge)).to_query
    end
    if @strategy.downcase == "jwt"
      jwt_defaults = {
        i: @meta[:id] || nil,
        w: @meta[:width] || nil,
        h: @meta[:height] || nil,
        r: @meta[:resolution] || nil,
        u: @meta[:agent] || nil,
        var: @variables,
      }
      payload = [{ d: @deck, t: @template, v: @version, e: @extension }, jwt_defaults].inject(&:merge)
      __jwt = JWT.encode(payload, key, 'HS256')
      return FlyyerHash.new({ __jwt: __jwt }.merge(default_v)).to_query
    end
  else
    return FlyyerHash.new([default_v, defaults, @variables].inject(&:merge)).to_query
  end
end