firebase-admin-sdk 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88be554faaf7046b8bd9b9f03f36f3a9390931f95c951b342a085d08848a1435
4
- data.tar.gz: 0ca72d1e3018939f92c739452b345ae39e06be7c9af9fb13e5769c443d8f03fa
3
+ metadata.gz: 556dcbf8f7adfc48f4f7f84802316f33a501c0fa546ee94b10002ace197da612
4
+ data.tar.gz: a4b82ab80e3799d6d1ee49a9575a7b3808ebb21b98717b44aca2735980dd177a
5
5
  SHA512:
6
- metadata.gz: 636e70de1043d56f6c4e7f31d6ed76f2f54dffe04bf2e24e65357cabb1da02f121c5834479837ec31673519101b11f115fac5716512c5601dca593e7b93a3883
7
- data.tar.gz: b97bf935283c404c6f701333bd01bf56458255068b43d3d6fb083d139e2ebed267d51675afc99a66ae9e3edc1d9a0fe461a69c72af1cc3d18168a97d482c59e0
6
+ metadata.gz: faf5476494b2286015ad38d6026b7bb112007fce730955d4c69d8cc71808f936e7c763620933c5215125e0d4fe1395bfbd2dcccbcc9ad454ebdd3b9a9c7e5f9c
7
+ data.tar.gz: 3d7eb689e309fc9b8aa939a666a84c1cbf0c43e0469964f8f9d95758a746fb6c7e286d22bf167cda448b71bb055863b760cb0cb616e91edbbe73eb125df386f8
data/.gitignore CHANGED
@@ -13,3 +13,6 @@ Gemfile.lock
13
13
 
14
14
  # rspec failure tracking
15
15
  .rspec_status
16
+
17
+ # ruby version
18
+ .ruby-version
data/README.md CHANGED
@@ -6,7 +6,7 @@ in Ruby.
6
6
  For more information, visit the
7
7
  [Firebase Admin SDK setup guide](https://firebase.google.com/docs/admin/setup/).
8
8
 
9
- This gem is currently in alpha and not recommended for production use (yet).
9
+ This gem is being used in production by https://cheddar.me
10
10
 
11
11
  ## Installation
12
12
 
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.add_runtime_dependency "googleauth", "> 0.16", "< 2.0"
25
25
  spec.add_runtime_dependency "faraday", "> 1", "< 3"
26
26
  spec.add_runtime_dependency "jwt", ">= 1.5", "< 3.0"
27
+ spec.add_runtime_dependency "google-apis-fcm_v1", ">= 0.19.0", "< 1.0"
27
28
 
28
29
  spec.add_development_dependency "rake"
29
30
  spec.add_development_dependency "rspec"
@@ -31,5 +32,5 @@ Gem::Specification.new do |spec|
31
32
  spec.add_development_dependency "fakefs"
32
33
  spec.add_development_dependency "climate_control"
33
34
  spec.add_development_dependency "standard"
34
- spec.add_development_dependency "activesupport"
35
+ spec.add_development_dependency "activesupport", "~> 7.0.8"
35
36
  end
@@ -3,7 +3,7 @@ module Firebase
3
3
  module Messaging
4
4
  # Aps dictionary to be included in an APNS payload.
5
5
  class APS
6
- # @return [APSAlert, String, nil]
6
+ # @return [Firebase::Admin::Messaging::APSAlert, String, nil]
7
7
  # Alert to be included in the message.
8
8
  attr_accessor :alert
9
9
 
@@ -12,7 +12,7 @@ module Firebase
12
12
  # remain unchanged.
13
13
  attr_accessor :badge
14
14
 
15
- # @return [String, CriticalSound, nil]
15
+ # @return [Firebase::Admin::Messaging::CriticalSound, String, nil]
16
16
  # Sound to be played with the message.
17
17
  attr_accessor :sound
18
18
 
@@ -39,12 +39,12 @@ module Firebase
39
39
 
40
40
  # Initializes an {APS}.
41
41
  #
42
- # @param [APSAlert, String, nil] alert
42
+ # @param [Firebase::Admin::Messaging::APSAlert, String, nil] alert
43
43
  # Alert to be included in the message (optional).
44
44
  # @param [Integer, nil] badge
45
45
  # Badge to be displayed with the message (optional).
46
46
  # Set to 0 to remove the badge. When not specified, the badge will remain unchanged.
47
- # @param [String, CriticalSound, nil] sound
47
+ # @param [Firebase::Admin::Messaging::CriticalSound, String, nil] sound
48
48
  # Sound to be played with the message (optional).
49
49
  # @param [Boolean, nil] content_available
50
50
  # Specifies whether to configure a background update notification (optional).
@@ -0,0 +1,29 @@
1
+ module Firebase
2
+ module Admin
3
+ module Messaging
4
+ # The response received from a batch request
5
+ class BatchResponse
6
+ # The list of responses (possibly empty).
7
+ # @return [Array<SendResponse>]
8
+ attr_reader :responses
9
+
10
+ # The number of successful messages.
11
+ # @return [Integer]
12
+ attr_reader :success_count
13
+
14
+ # The number of failed messages.
15
+ # @return [Integer]
16
+ attr_reader :failure_count
17
+
18
+ # A response received from a batch request.
19
+ #
20
+ # @param [Array<SendResponse>] responses
21
+ def initialize(responses:)
22
+ @responses = responses
23
+ @success_count = responses.count(:success?)
24
+ @failure_count = responses.count - @success_count
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,3 +1,5 @@
1
+ require "google-apis-fcm_v1"
2
+
1
3
  module Firebase
2
4
  module Admin
3
5
  module Messaging
@@ -5,8 +7,11 @@ module Firebase
5
7
  class Client
6
8
  def initialize(app)
7
9
  @project_id = app.project_id
8
- @http_client = Firebase::Admin::Internal::HTTPClient.new(credentials: app.credentials)
10
+ @project_path = "projects/#{app.project_id}"
9
11
  @message_encoder = MessageEncoder.new
12
+ @http_client = Firebase::Admin::Internal::HTTPClient.new(credentials: app.credentials)
13
+ @service = Google::Apis::FcmV1::FirebaseCloudMessagingService.new
14
+ @service.authorization = app.credentials
10
15
  end
11
16
 
12
17
  # Sends a message via Firebase Cloud Messaging (FCM).
@@ -19,13 +24,10 @@ module Firebase
19
24
  #
20
25
  # @return [String] A message id that uniquely identifies the message.
21
26
  def send_one(message, dry_run: false)
22
- body = {
23
- validate_only: dry_run,
24
- message: @message_encoder.encode(message)
25
- }
26
- res = @http_client.post(send_url, body, FCM_HEADERS)
27
- res.body["name"]
28
- rescue Faraday::Error => e
27
+ body = encode_message(message, dry_run: dry_run)
28
+ res = @service.send_message(@project_path, body, options: {skip_serialization: true})
29
+ res.name
30
+ rescue Google::Apis::Error => e
29
31
  raise parse_fcm_error(e)
30
32
  end
31
33
 
@@ -39,7 +41,21 @@ module Firebase
39
41
  #
40
42
  # @return [BatchResponse] A batch response.
41
43
  def send_all(messages, dry_run: false)
42
- raise NotImplementedError
44
+ raise "messages must be an Array" unless messages.is_a?(Array)
45
+ raise "messages must not contain more than 500 elements" unless messages.length < 500
46
+
47
+ responses = []
48
+ @service.batch do |service|
49
+ options = {skip_serialization: true}
50
+ messages.each do |message|
51
+ body = encode_message(message, dry_run: dry_run)
52
+ service.send_message(@project_path, body, options: options) do |res, err|
53
+ wrapped_err = parse_fcm_error(err) unless err.nil?
54
+ responses << SendResponse.new(message_id: res&.name, error: wrapped_err)
55
+ end
56
+ end
57
+ end
58
+ BatchResponse.new(responses: responses)
43
59
  end
44
60
 
45
61
  # Sends the given multicast message to all tokens via Firebase Cloud Messaging (FCM).
@@ -124,9 +140,9 @@ module Firebase
124
140
  TopicManagementResponse.new(res)
125
141
  end
126
142
 
127
- # @param [Faraday::Error] err
143
+ # @param [Google::Apis::Error] err
128
144
  def parse_fcm_error(err)
129
- msg, info = parse_platform_error(err.response_status, err.response_body)
145
+ msg, info = parse_platform_error(err.status_code, err.body)
130
146
  return err if info.empty?
131
147
 
132
148
  details = info["details"] || []
@@ -153,10 +169,19 @@ module Firebase
153
169
  [msg, details]
154
170
  end
155
171
 
172
+ # Encodes a send message request.
173
+ def encode_message(message, dry_run:)
174
+ body = {
175
+ message: @message_encoder.encode(message),
176
+ validateOnly: dry_run
177
+ }
178
+ JSON.generate(body)
179
+ end
180
+
156
181
  FCM_HOST = "https://fcm.googleapis.com"
157
182
  FCM_HEADERS = {"X-GOOG-API-FORMAT-VERSION": "2"}
158
183
  IID_HOST = "https://iid.googleapis.com"
159
- IID_HEADERS = {"access_token_auth" => "true"}
184
+ IID_HEADERS = {access_token_auth: "true"}
160
185
 
161
186
  FCM_ERROR_TYPES = {
162
187
  "APNS_AUTH_ERROR" => ThirdPartyAuthError,
@@ -1,3 +1,5 @@
1
+ require "json"
2
+
1
3
  module Firebase
2
4
  module Admin
3
5
  module Messaging
@@ -6,7 +8,7 @@ module Firebase
6
8
  #
7
9
  # @param [Message] message
8
10
  # The message to encode.
9
- # @return [Hash]
11
+ # @return [String] A json encoded string.
10
12
  def encode(message)
11
13
  raise ArgumentError, "message must be a Message" unless message.is_a?(Message)
12
14
  result = {
@@ -17,7 +19,7 @@ module Firebase
17
19
  notification: encode_notification(message.notification),
18
20
  token: check_string("Message.token", message.token, non_empty: true),
19
21
  topic: check_string("Message.topic", message.topic, non_empty: true),
20
- fcm_options: encode_fcm_options(message.fcm_options)
22
+ fcmOptions: encode_fcm_options(message.fcm_options)
21
23
  }
22
24
  result[:topic] = sanitize_topic_name(result[:topic])
23
25
  result = remove_nil_values(result)
@@ -47,13 +49,13 @@ module Firebase
47
49
  return nil unless v
48
50
  raise ArgumentError, "Message.android must be an AndroidConfig." unless v.is_a?(AndroidConfig)
49
51
  result = {
50
- collapse_key: check_string("AndroidConfig.collapse_key", v.collapse_key),
52
+ collapseKey: check_string("AndroidConfig.collapse_key", v.collapse_key),
51
53
  data: check_string_hash("AndroidConfig.data", v.data),
52
54
  notification: encode_android_notification(v.notification),
53
55
  priority: check_string("AndroidConfig.priority", v.priority, non_empty: true),
54
- restricted_package_name: check_string("AndroidConfig.restricted_package_name", v.restricted_package_name),
56
+ restrictedPackageName: check_string("AndroidConfig.restricted_package_name", v.restricted_package_name),
55
57
  ttl: encode_duration("AndroidConfig.ttl", v.ttl),
56
- fcm_options: encode_android_fcm_options(v.fcm_options)
58
+ fcmOptions: encode_android_fcm_options(v.fcm_options)
57
59
  }
58
60
  result = remove_nil_values(result)
59
61
  if result.key?(:priority) && !%w[normal high].include?(result[:priority])
@@ -71,49 +73,49 @@ module Firebase
71
73
 
72
74
  result = {
73
75
  body: check_string("AndroidNotification.body", v.body),
74
- body_loc_key: check_string("AndroidNotification.body_loc_key", v.body_loc_key),
75
- body_loc_args: check_string_array("AndroidNotification.body_loc_args", v.body_loc_args),
76
- click_action: check_string("AndroidNotification.click_action", v.click_action),
76
+ bodyLocKey: check_string("AndroidNotification.body_loc_key", v.body_loc_key),
77
+ bodyLocArgs: check_string_array("AndroidNotification.body_loc_args", v.body_loc_args),
78
+ clickAction: check_string("AndroidNotification.click_action", v.click_action),
77
79
  color: check_color("AndroidNotification.color", v.color, allow_alpha: true, required: false),
78
80
  icon: check_string("AndroidNotification.icon", v.icon),
79
81
  sound: check_string("AndroidNotification.sound", v.sound),
80
82
  tag: check_string("AndroidNotification.tag", v.tag),
81
83
  title: check_string("AndroidNotification.title", v.title),
82
- title_loc_key: check_string("AndroidNotification.title_loc_key", v.title_loc_key),
83
- title_loc_args: check_string_array("AndroidNotification.title_loc_args", v.title_loc_args),
84
- channel_id: check_string("AndroidNotification.channel_id", v.channel_id),
84
+ titleLocKey: check_string("AndroidNotification.title_loc_key", v.title_loc_key),
85
+ titleLocArgs: check_string_array("AndroidNotification.title_loc_args", v.title_loc_args),
86
+ channelId: check_string("AndroidNotification.channel_id", v.channel_id),
85
87
  image: check_string("AndroidNotification.image", v.image),
86
88
  ticker: check_string("AndroidNotification.ticker", v.ticker),
87
89
  sticky: v.sticky,
88
- event_time: check_time("AndroidNotification.event_time", v.event_time),
89
- local_only: v.local_only,
90
- notification_priority: check_string("AndroidNotification.priority", v.priority, non_empty: true),
91
- vibrate_timings: check_numeric_array("AndroidNotification.vibrate_timings", v.vibrate_timings),
92
- default_vibrate_timings: v.default_vibrate_timings,
93
- default_sound: v.default_sound,
94
- default_light_settings: v.default_light_settings,
95
- light_settings: encode_light_settings(v.light_settings),
90
+ eventTime: check_time("AndroidNotification.event_time", v.event_time),
91
+ localOnly: v.local_only,
92
+ notificationPriority: check_string("AndroidNotification.priority", v.priority, non_empty: true),
93
+ vibrateTimings: check_numeric_array("AndroidNotification.vibrate_timings", v.vibrate_timings),
94
+ defaultVibrateTimings: v.default_vibrate_timings,
95
+ defaultSound: v.default_sound,
96
+ defaultLightSettings: v.default_light_settings,
97
+ lightSettings: encode_light_settings(v.light_settings),
96
98
  visibility: check_string("AndroidNotification.visibility", v.visibility, non_empty: true),
97
- notification_count: check_numeric("AndroidNotification.notification_count", v.notification_count)
99
+ notificationCount: check_numeric("AndroidNotification.notification_count", v.notification_count)
98
100
  }
99
101
  result = remove_nil_values(result)
100
102
 
101
- if result.key?(:body_loc_args) && !result.key?(:body_loc_key)
103
+ if result.key?(:bodyLocArgs) && !result.key?(:bodyLocKey)
102
104
  raise ArgumentError, "AndroidNotification.body_loc_key is required when specifying body_loc_args"
103
- elsif result.key?(:title_loc_args) && !result.key?(:title_loc_key)
105
+ elsif result.key?(:titleLocArgs) && !result.key?(:titleLocKey)
104
106
  raise ArgumentError, "AndroidNotification.title_loc_key is required when specifying title_loc_args"
105
107
  end
106
108
 
107
- if (event_time = result[:event_time])
108
- event_time = event_time.dup.utc unless event_time.utc?
109
- result[:event_time] = event_time.strftime("%Y-%m-%dT%H:%M:%S.%6NZ")
109
+ if (event_time = result[:eventTime])
110
+ event_time = event_time.getutc unless event_time.utc?
111
+ result[:eventTime] = event_time.strftime("%Y-%m-%dT%H:%M:%S.%6NZ")
110
112
  end
111
113
 
112
- if (priority = result[:notification_priority])
114
+ if (priority = result[:notificationPriority])
113
115
  unless %w[min low default high max].include?(priority)
114
116
  raise ArgumentError, "AndroidNotification.priority must be 'default', 'min', 'low', 'high' or 'max'."
115
117
  end
116
- result[:notification_priority] = "PRIORITY_#{priority.upcase}"
118
+ result[:notificationPriority] = "PRIORITY_#{priority.upcase}"
117
119
  end
118
120
 
119
121
  if (visibility = result[:visibility])
@@ -123,11 +125,11 @@ module Firebase
123
125
  result[:visibility] = visibility.upcase
124
126
  end
125
127
 
126
- if (vibrate_timings = result[:vibrate_timings])
128
+ if (vibrate_timings = result[:vibrateTimings])
127
129
  vibrate_timing_strings = vibrate_timings.map do |t|
128
130
  encode_duration("AndroidNotification.vibrate_timings", t)
129
131
  end
130
- result[:vibrate_timings] = vibrate_timing_strings
132
+ result[:vibrateTimings] = vibrate_timing_strings
131
133
  end
132
134
 
133
135
  result
@@ -140,7 +142,7 @@ module Firebase
140
142
  raise ArgumentError, "AndroidConfig.fcm_options must be an AndroidFCMOptions"
141
143
  end
142
144
  result = {
143
- analytics_label: check_analytics_label("AndroidFCMOptions.analytics_label", v.analytics_label)
145
+ analyticsLabel: check_analytics_label("AndroidFCMOptions.analytics_label", v.analytics_label)
144
146
  }
145
147
  remove_nil_values(result)
146
148
  end
@@ -159,14 +161,14 @@ module Firebase
159
161
  raise ArgumentError, "AndroidNotification.light_settings must be a LightSettings." unless v.is_a?(LightSettings)
160
162
  result = {
161
163
  color: encode_color("LightSettings.color", v.color, allow_alpha: true),
162
- light_on_duration: encode_duration("LightSettings.light_on_duration", v.light_on_duration),
163
- light_off_duration: encode_duration("LightSettings.light_off_duration", v.light_off_duration)
164
+ lightOnDuration: encode_duration("LightSettings.light_on_duration", v.light_on_duration),
165
+ lightOffDuration: encode_duration("LightSettings.light_off_duration", v.light_off_duration)
164
166
  }
165
167
  result = remove_nil_values(result)
166
- unless result.key?(:light_on_duration)
168
+ unless result.key?(:lightOnDuration)
167
169
  raise ArgumentError, "LightSettings.light_on_duration is required"
168
170
  end
169
- unless result.key?(:light_off_duration)
171
+ unless result.key?(:lightOffDuration)
170
172
  raise ArgumentError, "LightSettings.light_off_duration is required"
171
173
  end
172
174
  result
@@ -190,7 +192,7 @@ module Firebase
190
192
  result = {
191
193
  headers: check_string_hash("APNSConfig.headers", apns.headers),
192
194
  payload: encode_apns_payload(apns.payload),
193
- fcm_options: encode_apns_fcm_options(apns.fcm_options)
195
+ fcmOptions: encode_apns_fcm_options(apns.fcm_options)
194
196
  }
195
197
  remove_nil_values(result)
196
198
  end
@@ -213,7 +215,7 @@ module Firebase
213
215
  return nil unless options
214
216
  raise ArgumentError, "APNSConfig.fcm_options must be an APNSFCMOptions" unless options.is_a?(APNSFCMOptions)
215
217
  result = {
216
- analytics_label: check_analytics_label("APNSFCMOptions.analytics_label", options.analytics_label),
218
+ analyticsLabel: check_analytics_label("APNSFCMOptions.analytics_label", options.analytics_label),
217
219
  image: check_string("APNSFCMOptions.image", options.image)
218
220
  }
219
221
  remove_nil_values(result)
@@ -331,7 +333,7 @@ module Firebase
331
333
  return nil unless options
332
334
  raise ArgumentError, "Message.fcm_options must be a FCMOptions." unless options.is_a?(FCMOptions)
333
335
  result = {
334
- analytics_label: check_analytics_label("Message.fcm_options", options.analytics_label)
336
+ analyticsLabel: check_analytics_label("Message.fcm_options", options.analytics_label)
335
337
  }
336
338
  remove_nil_values(result)
337
339
  end
@@ -30,6 +30,15 @@ module Firebase
30
30
  # Registration token of the device to which the message should be sent (optional).
31
31
  attr_accessor :tokens
32
32
 
33
+ # @return [String, nil]
34
+ # Name of the FCM topic to which the message should be sent (optional). Topic name may contain the `/topics/`
35
+ # prefix.
36
+ attr_accessor :topic
37
+
38
+ # @return [String, nil]
39
+ # The FCM condition to which the message should be sent (optional).
40
+ attr_accessor :condition
41
+
33
42
  # Initializes a {Message}.
34
43
  #
35
44
  # @param [Hash<String, String>, nil] data
@@ -44,13 +53,20 @@ module Firebase
44
53
  # An {FCMOptions} (optional).
45
54
  # @param [Array<String>, nil] tokens
46
55
  # A registration token of the device to send the message to (optional).
56
+ # @param [String, nil] topic
57
+ # The name of the FCM topic to send the message to (optional).
58
+ # The topic name may contain the `/topics/` prefix.
59
+ # @param [String, nil] condition
60
+ # The FCM condition to which the message should be sent (optional)
47
61
  def initialize(
48
62
  data: nil,
49
63
  notification: nil,
50
64
  android: nil,
51
65
  apns: nil,
52
66
  fcm_options: nil,
53
- tokens: nil
67
+ tokens: nil,
68
+ topic: nil,
69
+ condition: nil
54
70
  )
55
71
  self.data = data
56
72
  self.notification = notification
@@ -0,0 +1,31 @@
1
+ module Firebase
2
+ module Admin
3
+ module Messaging
4
+ # The response received from an individual batched request.
5
+ class SendResponse
6
+ # A message id string that uniquely identifies the message.
7
+ # @return [String]
8
+ attr_reader :message_id
9
+
10
+ # The error if one occurred while sending the message.
11
+ # @return [Error]
12
+ attr_reader :error
13
+
14
+ # A boolean indicating if the request was successful.
15
+ # @return [Boolean]
16
+ def success?
17
+ !!@message_id
18
+ end
19
+
20
+ # Initializes the object.
21
+ #
22
+ # @param [String, nil] message_id the id of the sent message
23
+ # @param [Error, nil] error the error that occurred
24
+ def initialize(message_id:, error:)
25
+ @message_id = message_id
26
+ @error = error
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -61,11 +61,10 @@ module Firebase
61
61
  return nil unless value || required
62
62
  raise ArgumentError, "#{label} is required" unless value
63
63
  raise ArgumentError, "#{label} must be a string" unless value.is_a?(String)
64
- unless /\A#[0-9a-fA-F]{6}\Z/.match?(value) || (/\A#[0-9a-fA-F]{8}\Z/.match?(value) && allow_alpha)
65
- raise ArgumentError, "#{label} must be in the form #RRGGBB" unless allow_alpha
66
- raise ArgumentError, "#{label} must be in the form #RRGGBB or #RRGGBBAA"
67
- end
68
- value
64
+ return value if /\A#[0-9a-fA-F]{6}\Z/.match?(value)
65
+ return value if /\A#[0-9a-fA-F]{8}\Z/.match?(value) && allow_alpha
66
+ raise ArgumentError, "#{label} must be in the form #RRGGBB" unless allow_alpha
67
+ raise ArgumentError, "#{label} must be in the form #RRGGBB or #RRGGBBAA"
69
68
  end
70
69
 
71
70
  def to_seconds_string(seconds)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Firebase
4
4
  module Admin
5
- VERSION = "0.2.0"
5
+ VERSION = "0.3.1"
6
6
  end
7
7
  end
@@ -34,4 +34,6 @@ require_relative "firebase/admin/messaging/message_encoder"
34
34
  require_relative "firebase/admin/messaging/multicast_message"
35
35
  require_relative "firebase/admin/messaging/error_info"
36
36
  require_relative "firebase/admin/messaging/topic_management_response"
37
+ require_relative "firebase/admin/messaging/send_response"
38
+ require_relative "firebase/admin/messaging/batch_response"
37
39
  require_relative "firebase/admin/messaging/client"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: firebase-admin-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tariq Zaid
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-25 00:00:00.000000000 Z
11
+ date: 2023-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: googleauth
@@ -70,6 +70,26 @@ dependencies:
70
70
  - - "<"
71
71
  - !ruby/object:Gem::Version
72
72
  version: '3.0'
73
+ - !ruby/object:Gem::Dependency
74
+ name: google-apis-fcm_v1
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 0.19.0
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 0.19.0
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: '1.0'
73
93
  - !ruby/object:Gem::Dependency
74
94
  name: rake
75
95
  requirement: !ruby/object:Gem::Requirement
@@ -158,16 +178,16 @@ dependencies:
158
178
  name: activesupport
159
179
  requirement: !ruby/object:Gem::Requirement
160
180
  requirements:
161
- - - ">="
181
+ - - "~>"
162
182
  - !ruby/object:Gem::Version
163
- version: '0'
183
+ version: 7.0.8
164
184
  type: :development
165
185
  prerelease: false
166
186
  version_requirements: !ruby/object:Gem::Requirement
167
187
  requirements:
168
- - - ">="
188
+ - - "~>"
169
189
  - !ruby/object:Gem::Version
170
- version: '0'
190
+ version: 7.0.8
171
191
  description:
172
192
  email:
173
193
  - tariq@cheddar.me
@@ -208,6 +228,7 @@ files:
208
228
  - lib/firebase/admin/messaging/apns_payload.rb
209
229
  - lib/firebase/admin/messaging/aps.rb
210
230
  - lib/firebase/admin/messaging/aps_alert.rb
231
+ - lib/firebase/admin/messaging/batch_response.rb
211
232
  - lib/firebase/admin/messaging/client.rb
212
233
  - lib/firebase/admin/messaging/critical_sound.rb
213
234
  - lib/firebase/admin/messaging/error.rb
@@ -218,6 +239,7 @@ files:
218
239
  - lib/firebase/admin/messaging/message_encoder.rb
219
240
  - lib/firebase/admin/messaging/multicast_message.rb
220
241
  - lib/firebase/admin/messaging/notification.rb
242
+ - lib/firebase/admin/messaging/send_response.rb
221
243
  - lib/firebase/admin/messaging/topic_management_response.rb
222
244
  - lib/firebase/admin/messaging/utils.rb
223
245
  - lib/firebase/admin/middleware/request/credentials.rb
@@ -241,7 +263,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
241
263
  - !ruby/object:Gem::Version
242
264
  version: '0'
243
265
  requirements: []
244
- rubygems_version: 3.4.10
266
+ rubygems_version: 3.4.21
245
267
  signing_key:
246
268
  specification_version: 4
247
269
  summary: Firebase Admin SDK for Ruby