class MessagebusApnApi::Messagebus

Constants

PLATFORM_ANDROID
PLATFORM_IOS

Attributes

send_common_info[W]

Public Class Methods

new(api_key) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 28
def initialize(api_key)
  @api_key = api_key
  init_http_connection(domain)

  @msg_buffer_size = 20
  @msg_buffer = []
  @msg_buffer_flushed = false

  @register_buffer_size = 20
  @register_buffer = []
  @register_buffer_flushed = false

  @send_common_info = {}
  @results = base_response_params
  @rest_endpoints = define_rest_endpoints
  @rest_http_errors = define_rest_http_errors
end

Public Instance Methods

add_apn_register(params, app_key, flush_buffer = false) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 107
def add_apn_register(params, app_key, flush_buffer = false)
  @register_buffer << base_apn_register_params.merge!(params)

  @register_buffer_flushed = false
  if flush_buffer || @register_buffer.size >= @register_buffer_size
    apn_register_flush(app_key)
  end
  return
end
add_apn_send(params, app_key, flush_buffer = false) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 78
def add_apn_send(params, app_key, flush_buffer = false)
  @msg_buffer << base_apn_send_params.merge!(params)

  @msg_buffer_flushed = false
  if flush_buffer || @msg_buffer.size >= @msg_buffer_size
    apn_send_flush(app_key)
  end
  return
end
api_version() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 74
def api_version
  make_api_get_call(@rest_endpoints[:version])
end
apn_register_flush(app_key) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 117
def apn_register_flush(app_key)
  if (@register_buffer.size==0)
    @results=@empty_send_results
    return
  end

  endpoint = @rest_endpoints[:apn_register].gsub("%KEY%", app_key)

  json = json_apn_register_from_list(@register_buffer)
  if (@last_init_time < Time.now.utc - 60)
    init_http_connection(domain)
  end
  @results=make_api_post_call(endpoint, json)
  @register_buffer.clear
  @register_buffer_flushed = true
  return
end
apn_send_flush(app_key) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 88
def apn_send_flush(app_key)
  if (@msg_buffer.size==0)
    @results=@empty_send_results
    return
  end

  endpoint = @rest_endpoints[:apn_send].gsub("%KEY%", app_key)

  json = json_apn_send_from_list(@msg_buffer)
  if (@last_init_time < Time.now.utc - 60)
    init_http_connection(domain)
  end
  @results=make_api_post_call(endpoint, json)
  @msg_buffer.clear

  @msg_buffer_flushed = true
  return
end
cacert_info(cert_file) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 141
def cacert_info(cert_file)
  @http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  if !File.exists?(cert_file)
    raise MessagebusApi::MissingFileError.new("Unable to read file #{cert_file}")
  end
  @http.ca_file = File.join(cert_file)
end
get_apn_apps() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 135
def get_apn_apps
  path = @rest_endpoints[:apn_apps]
  @results = make_api_get_call(path)
  @results
end
register_buffer_size() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 66
def register_buffer_size
  @register_buffer_size
end
register_buffer_size=(size) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 62
def register_buffer_size=(size)
  @register_buffer_size = size if (size >= 1 && size <= 100)
end
register_flushed?() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 70
def register_flushed?
  @register_buffer_flushed
end
results() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 46
def results
  @results
end
send_buffer_size() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 54
def send_buffer_size
  @msg_buffer_size
end
send_buffer_size=(size) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 50
def send_buffer_size=(size)
  @msg_buffer_size = size if (size >= 1 && size <= 100)
end
send_flushed?() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 58
def send_flushed?
  @msg_buffer_flushed
end

Private Instance Methods

base_apn_register_params() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 260
def base_apn_register_params
  {
      :userName => '',
      :deviceToken => '',
      :platform => ''
  }
end
base_apn_send_params() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 268
def base_apn_send_params
  {
      :userName => '',
      :alert => '',
      :platform => '',
      :customFields => {}
  }
end
base_response_params() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 277
def base_response_params
  {:statusCode => 0,
   :statusMessage => "",
   :statusTime => "1970-01-01T00:00:00.000Z"}
end
check_response(response, symbolize_names=true) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 195
def check_response(response, symbolize_names=true)
  case response
    when Net::HTTPSuccess
      begin
        return JSON.parse(response.body, :symbolize_names => symbolize_names)
      rescue JSON::ParserError => e
        raise MessagebusApi::RemoteServerError.new("JSON parsing error.  Response started with #{response.body.slice(0..9)}")
      end
    when Net::HTTPClientError, Net::HTTPServerError
      if (response.body && response.body.size > 0)
        result = begin
          JSON.parse(response.body, :symbolize_names => symbolize_names)
        rescue JSON::ParserError
          nil
        end
        raise MessagebusApi::RemoteServerError.new("#{response.code.to_s}:#{rest_http_error_message(response.code.to_s)}")
      else
        raise MessagebusApi::RemoteServerError.new("#{response.code.to_s}:#{rest_http_error_message(response.code.to_s)}")
      end
    else
      raise "Unexpected HTTP Response: #{response.class.name}"
  end
  raise "Could not determine response"
end
common_http_headers() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 167
def common_http_headers
  {'User-Agent' => MessagebusApi::Info.get_user_agent, 'X-MessageBus-Key' => @api_key}
end
define_rest_endpoints() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 230
def define_rest_endpoints
  {
      :apn_register => "/api/v3/app/%KEY%/register",
      :apn_send => "/api/v3/app/%KEY%/send",
      :apn_apps => "/api/v3/apps",
      :version => "/api/version"
  }
end
define_rest_http_errors() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 239
def define_rest_http_errors
  {
      "400" => "Invalid Request",
      "401" => "Unauthorized-Missing API Key",
      "403" => "Unauthorized-Invalid API Key",
      "404" => "Incorrect URL",
      "405" => "Method not allowed",
      "406" => "Format not acceptable",
      "408" => "Request Timeout",
      "409" => "Conflict",
      "410" => "Object missing or deleted",
      "413" => "Too many messages in request",
      "415" => "POST JSON data invalid",
      "422" => "Unprocessable Entity",
      "500" => "Internal Server Error",
      "501" => "Not Implemented",
      "503" => "Service Unavailable",
      "507" => "Insufficient Storage"
  }
end
domain() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 163
def domain
  DEFAULT_API_APN_ENDPOINT_STRING
end
init_http_connection(target_server) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 151
def init_http_connection(target_server)
  if (@http and @http.started?)
    @http.finish
  end
  @last_init_time = Time.now.utc
  endpoint_url = URI.parse(target_server)
  @http = Net::HTTP.new(endpoint_url.host, endpoint_url.port)
  @http.use_ssl = true
  @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  @http
end
json_apn_register_from_list(users) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 179
def json_apn_register_from_list(users)
  {:users => users}.to_json
end
json_apn_send_from_list(messages) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 175
def json_apn_send_from_list(messages)
  {:messages => messages}.to_json
end
make_api_get_call(path) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 189
def make_api_get_call(path)
  headers = common_http_headers
  response = @http.request_get(path, headers)
  check_response(response)
end
make_api_post_call(path, data) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 183
def make_api_post_call(path, data)
  headers = common_http_headers.merge(rest_post_headers)
  response = @http.request_post(path, data, headers)
  check_response(response)
end
rest_http_error?(status_code) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 220
def rest_http_error?(status_code)
  @rest_http_errors.key?(status_code)
end
rest_http_error_message(status_code) click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 224
def rest_http_error_message(status_code)
  message = "Unknown Error Code"
  message = @rest_http_errors[status_code] if rest_http_error?(status_code)
  message
end
rest_post_headers() click to toggle source
# File lib/messagebus_ruby_apn_api/messagebus.rb, line 171
def rest_post_headers
  {"Content-Type" => "application/json; charset=utf-8"}
end