lib/ruby-push-notifications/fcm/fcm_connection.rb
# frozen_string_literal: true
require 'uri'
require 'net/https'
module RubyPushNotifications
module FCM
# Encapsulates a connection to the FCM service
# Responsible for final connection with the service.
#
# @author Carlos Alonso
class FCMConnection
# @private The URL of the Android FCM endpoint
# Credits: https://github.com/calos0921 - for this url change to FCM std
FCM_URL = 'https://fcm.googleapis.com/fcm/send'
# @private Content-Type HTTP Header string
CONTENT_TYPE_HEADER = 'Content-Type'
# @private Application/JSON content type
JSON_CONTENT_TYPE = 'application/json'
# @private Authorization HTTP Header String
AUTHORIZATION_HEADER = 'Authorization'
# Issues a POST request to the FCM send endpoint to
# submit the given notifications.
#
# @param notification [String]. The text to POST
# @param key [String]. The FCM sender id to use
# (https://developer.android.com/google/fcm/fcm.html#senderid)
# @param options [Hash] optional. Options for #post. Currently supports:
# * url [String]: URL of the FCM endpoint. Defaults to the official FCM URL.
# * open_timeout [Integer]: Number of seconds to wait for the connection to open. Defaults to 30.
# * read_timeout [Integer]: Number of seconds to wait for one block to be read. Defaults to 30.
# @return [FCMResponse]. The FCMResponse that encapsulates the received response
def self.post(notification, key, options = {})
headers = {
CONTENT_TYPE_HEADER => JSON_CONTENT_TYPE,
AUTHORIZATION_HEADER => "key=#{key}"
}
url = URI.parse options.fetch(:url, FCM_URL)
http = Net::HTTP.new url.host, url.port
http.use_ssl = url.scheme == 'https'
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
http.open_timeout = options.fetch(:open_timeout, 30)
http.read_timeout = options.fetch(:read_timeout, 30)
response = http.post url.path, notification, headers
FCMResponse.new response.code.to_i, response.body
end
end
end
end