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