class Flyyer::Flyyer

Attributes

meta[RW]
path[RW]
project[RW]
secret[RW]
strategy[RW]
variables[RW]

Public Class Methods

create(&block) click to toggle source
# File lib/flyyer.rb, line 12
def self.create(&block)
  self.new(&block)
end
new(project = nil, path = nil, variables = {}, meta = {}, secret = nil, strategy = nil) { |self| ... } click to toggle source
# File lib/flyyer.rb, line 16
def initialize(project = nil, path = nil, variables = {}, meta = {}, secret = nil, strategy = nil)
  @project = project
  @path = path || "/"
  @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 77
def href
  raise Error.new('Missing "project" property') if @project.nil?

  signature = self.sign
  params = self.querystring
  if strategy.nil? || strategy != "JWT" then
    "https://cdn.flyyer.io/v2/#{@project}/#{signature}/#{params}#{self.path_safe}"
  else
    "https://cdn.flyyer.io/v2/#{@project}/jwt-#{signature}?__v=#{@meta[:v] || Time.now.to_i}"
  end
end
params_hash(ignoreV) click to toggle source
# File lib/flyyer.rb, line 30
def params_hash(ignoreV)
  defaults = {
    __v: @meta[:v] || Time.now.to_i, # This forces crawlers to refresh the image
    __id: @meta[:id] || nil,
    _w: @meta[:width] || nil,
    _h: @meta[:height] || nil,
    _res: @meta[:resolution] || nil,
    _ua: @meta[:agent] || nil
  }
  defaults.delete(:__v) if ignoreV
  @variables.nil? ? defaults : defaults.merge(@variables)
end
path_safe() click to toggle source
# File lib/flyyer.rb, line 26
def path_safe
  @path.start_with?("/") ? @path : "/#{@path}"
end
querystring(ignoreV = false) click to toggle source
# File lib/flyyer.rb, line 43
def querystring(ignoreV = false)
  # 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

  defaults = self.params_hash(ignoreV)
  result = FlyyerHash.new(defaults)
  result.to_query.split("&").sort().join("&")
end
sign() click to toggle source
# File lib/flyyer.rb, line 58
def sign
  return '_' if @strategy.nil? and @secret.nil?
  raise Error.new('Got `strategy` but missing `secret`. You can find it in your project in Advanced settings.') if @secret.nil?
  raise Error.new('Got `secret` but missing `strategy`.  Valid options are `HMAC` or `JWT`.') if @strategy.nil?
  key = @secret
  data = "#{@project}#{self.path_safe}#{self.querystring(true)}"
  if strategy.downcase == "hmac" then
    mac = OpenSSL::HMAC.hexdigest('SHA256', key, data)
    mac[0..15]
  elsif strategy.downcase == "jwt"
    payload = { "params": self.params_hash(true).compact, "path": self.path_safe}
    JWT.encode(payload, key, 'HS256')
  else
    raise Error.new('Invalid `strategy`. Valid options are `HMAC` or `JWT`.')
  end
end