Class: FirebaseCloudMessenger::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/firebase_cloud_messenger/client.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(credentials_path = nil, project_id = nil) ⇒ Client

Returns a new instance of Client.



8
9
10
11
12
13
14
15
# 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

Instance Attribute Details

#access_tokenObject



54
55
56
# File 'lib/firebase_cloud_messenger/client.rb', line 54

def access_token
  @access_token ||= access_token_info["access_token"]
end

#access_token_infoObject



62
63
64
# File 'lib/firebase_cloud_messenger/client.rb', line 62

def access_token_info
  @access_token_info ||= auth_client.fetch_access_token_info
end

#credentials_pathObject

Returns the value of attribute credentials_path.



6
7
8
# File 'lib/firebase_cloud_messenger/client.rb', line 6

def credentials_path
  @credentials_path
end

#max_retry_countObject



79
80
81
# File 'lib/firebase_cloud_messenger/client.rb', line 79

def max_retry_count
  @max_retry_count ||= 1
end

#project_idObject



71
72
73
# File 'lib/firebase_cloud_messenger/client.rb', line 71

def project_id
  @project_id ||= JSON.parse(File.read(credentials_path)).fetch("project_id")
end

Instance Method Details

#auth_clientObject



58
59
60
# File 'lib/firebase_cloud_messenger/client.rb', line 58

def auth_client
  @auth_client ||= AuthClient.new(credentials_path)
end

#refresh_access_token_infoObject



66
67
68
69
# 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) ⇒ Object



47
48
49
50
51
52
# 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_connObject



34
35
36
37
38
# 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_headersObject



40
41
42
43
44
45
# 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) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 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_urlObject



75
76
77
# File 'lib/firebase_cloud_messenger/client.rb', line 75

def send_url
  URI "https://fcm.googleapis.com/v1/projects/#{project_id}/messages:send"
end