class OpenTok::OpenTokSDK

Attributes

api_url[W]

Public Class Methods

new(partner_id, partner_secret) click to toggle source

@@API_URL = API_URL

# File lib/OpenTok/OpenTokSDK.rb, line 84
def initialize(partner_id, partner_secret)
  @api_url = API_URL
  @partner_id = partner_id
  @partner_secret = partner_secret.strip
end

Public Instance Methods

create_session(location='', opts={}) click to toggle source
# File lib/OpenTok/OpenTokSDK.rb, line 135
def create_session(location='', opts={})
  opts.merge!({:partner_id => @partner_id, :location=>location})
  doc = do_request("/session/create", opts)
  if not doc.get_elements('Errors').empty?
    raise OpenTokException.new doc.get_elements('Errors')[0].get_elements('error')[0].children.to_s
  end
  OpenTokSession.new(doc.root.get_elements('Session')[0].get_elements('session_id')[0].children[0].to_s)
end
generate_token(opts = {}) click to toggle source
# File lib/OpenTok/OpenTokSDK.rb, line 90
def generate_token(opts = {})
  {:session_id=>nil, :create_time=>nil, :expire_time=>nil, :role=>nil, :connection_data=>nil}.merge!(opts)

  create_time = opts[:create_time].nil? ? Time.now  :  opts[:create_time]
  session_id = opts[:session_id].nil? ? '' : opts[:session_id]
  role = opts[:role].nil? ? RoleConstants::PUBLISHER : opts[:role]

  if role != RoleConstants::SUBSCRIBER and \
      role != RoleConstants::PUBLISHER and \
      role != RoleConstants::MODERATOR
    raise OpenTokException.new "'#{role}' is not a recognized role"
  end


  data_params = {
    :role => role,
    :session_id => session_id,
    :create_time => create_time.to_i,
    :nonce => rand
  }

  if not opts[:expire_time].nil?
    raise OpenTokException.new 'Expire time must be a number' if not opts[:expire_time].is_a?(Numeric)
    raise OpenTokException.new 'Expire time must be in the future' if opts[:expire_time] < Time.now.to_i
    raise OpenTokException.new 'Expire time must be in the next 7 days' if opts[:expire_time] > (Time.now.to_i + 604800)
    data_params[:expire_time] = opts[:expire_time].to_i
  end
  
  if not opts[:connection_data].nil?
    raise OpenTokException.new 'Connection data must be less than 1000 characters' if opts[:connection_data].length > 1000
    data_params[:connection_data] = opts[:connection_data]
  end

  data_string = data_params.urlencode

  sig = sign_string(data_string, @partner_secret)
  meta_string = {
    :partner_id => @partner_id,
    :sdk_version => @@SDK_VERSION,
    :sig => sig
  }.urlencode

  @@TOKEN_SENTINEL + Base64.encode64(meta_string + ":" + data_string).gsub("\n","")
end

Protected Instance Methods

do_request(api_url, params, token=nil) click to toggle source
# File lib/OpenTok/OpenTokSDK.rb, line 150
def do_request(api_url, params, token=nil)

  url = URI.parse(@api_url + api_url)
  if not params.empty?
    req = Net::HTTP::Post.new(url.path)
    req.set_form_data(params)
  else
    req = Net::HTTP::Get.new(url.path)
  end

  if not token.nil?
    req.add_field 'X-TB-TOKEN-AUTH', token
  else
    req.add_field 'X-TB-PARTNER-AUTH', "#{@partner_id}:#{@partner_secret}"
  end
  http = Net::HTTP.new(url.host, url.port)
  http.use_ssl = true if @api_url.start_with?("https")
  res = http.start {|http| http.request(req)}
  case res
  when Net::HTTPSuccess, Net::HTTPRedirection
    # OK
    doc = REXML::Document.new(res.read_body)
    return doc
  else
    res.error!
  end
rescue Net::HTTPExceptions
  raise
  raise OpenTokException.new 'Unable to create fufill request: ' + $!
rescue NoMethodError
  raise
  raise OpenTokException.new 'Unable to create a fufill request at this time: ' + $1
end
sign_string(data, secret) click to toggle source
# File lib/OpenTok/OpenTokSDK.rb, line 146
def sign_string(data, secret)
  OpenSSL::HMAC.hexdigest(DIGEST, secret, data)
end