class FirebaseCloudMessenger::Client

Attributes

access_token[W]
access_token_info[W]
credentials_path[RW]
max_retry_count[W]
project_id[W]

Public Class Methods

new(credentials_path = nil, project_id = nil) click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 8
def initialize(credentials_path = nil, project_id = nil)
  @credentials_path = credentials_path || ENV['GOOGLE_APPLICATION_CREDENTIALS']
  @project_id = project_id

  if !(@credentials_path || @project_id)
    raise ArgumentError, "Either a project_id or a credentials_path must be supplied"
  end
end

Public Instance Methods

access_token() click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 54
def access_token
  @access_token ||= access_token_info["access_token"]
end
access_token_info() click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 62
def access_token_info
  @access_token_info ||= auth_client.fetch_access_token_info
end
auth_client() click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 58
def auth_client
  @auth_client ||= AuthClient.new(credentials_path)
end
max_retry_count() click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 79
def max_retry_count
  @max_retry_count ||= 1
end
project_id() click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 71
def project_id
  @project_id ||= JSON.parse(File.read(credentials_path)).fetch("project_id")
end
refresh_access_token_info() click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 66
def refresh_access_token_info
  self.access_token = nil
  self.access_token_info = auth_client.fetch_access_token_info
end
request_body(message, validate_only) click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 47
def request_body(message, validate_only)
  {
    message: message.to_h,
    validateOnly: validate_only
  }.to_json
end
request_conn() click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 34
def request_conn
  conn = Net::HTTP.new(send_url.host, 443)
  conn.use_ssl = true
  conn
end
request_headers() click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 40
def request_headers
  {
    "Content-Type" => "application/json",
    "Authorization" => "Bearer #{access_token}"
  }
end
send(message, validate_only, conn) click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 17
def send(message, validate_only, conn)
  retry_count = 0

  loop do
    response = make_fcm_request(message, validate_only, conn || request_conn)

    retry_count += 1
    if response_successful?(response) || retry_count > max_retry_count
      return message_from_response(response)
    elsif response.code == "401"
      refresh_access_token_info
    else
      raise Error.from_response(response)
    end
  end
end
send_url() click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 75
def send_url
  URI "https://fcm.googleapis.com/v1/projects/#{project_id}/messages:send"
end

Private Instance Methods

make_fcm_request(message, validate_only, conn = request_conn) click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 87
def make_fcm_request(message, validate_only, conn = request_conn)
  conn.post(send_url.path,
            request_body(message, validate_only),
            request_headers)
rescue Net::OpenTimeout
  raise ConnectTimeout
rescue Net::ReadTimeout
  raise ReadTimeout
end
message_from_response(response) click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 97
def message_from_response(response)
  JSON.parse(response.body)
end
response_successful?(response) click to toggle source
# File lib/firebase_cloud_messenger/client.rb, line 101
def response_successful?(response)
  ("200".."299").include?(response.code)
end