class Rox::Core::StateSender

Public Class Methods

md5_signature(serialized_feature_flags, serialized_custom_properties, device_properties, dev_mode_secret) click to toggle source
# File lib/rox/core/network/state_sender.rb, line 76
def self.md5_signature(serialized_feature_flags, serialized_custom_properties, device_properties, dev_mode_secret)
  values = state_payload(serialized_feature_flags, serialized_custom_properties, device_properties,
                         dev_mode_secret).values

  hash = Digest::MD5.hexdigest(values.join('|'))
  hash.upcase
end
new(sdk_settings, device_properties, flag_repository, custom_property_repository) click to toggle source
# File lib/rox/core/network/state_sender.rb, line 15
def initialize(sdk_settings, device_properties, flag_repository, custom_property_repository)
  @sdk_settings = sdk_settings
  @device_properties = device_properties
  @flag_repository = flag_repository
  @custom_property_repository = custom_property_repository
  @request = Request.new
  @debouncer = Debouncer.new(1, proc { send })
end
seralize_flag_repository(flag_repository) click to toggle source
# File lib/rox/core/network/state_sender.rb, line 95
def self.seralize_flag_repository(flag_repository)
  flags = []
  flag_repository.all_flags.sort_by(&:name).each do |f|
    flags << {
      name: f.name,
      defaultValue: f.default_value,
      options: f.options
    }
  end
  flags
end
seralize_flag_repository_with_values(flag_repository) click to toggle source
# File lib/rox/core/network/state_sender.rb, line 107
def self.seralize_flag_repository_with_values(flag_repository)
  flags = []
  flag_repository.all_flags.sort_by(&:name).each do |f|
    flags << {
      name: f.name,
      enabled: f.enabled?,
      defaultValue: f.default_value,
      options: f.options
    }
  end
  flags
end
serialize_custom_properties_repository(custom_property_repository) click to toggle source
# File lib/rox/core/network/state_sender.rb, line 120
def self.serialize_custom_properties_repository(custom_property_repository)
  properties = []
  custom_property_repository.all_custom_properties.sort_by(&:name).each do |p|
    properties << {
      name: p.name,
      type: p.type.type,
      externalType: p.type.external_type
    }
  end
  properties
end
serialize_custom_properties_repository_with_values(custom_property_repository) click to toggle source
# File lib/rox/core/network/state_sender.rb, line 132
def self.serialize_custom_properties_repository_with_values(custom_property_repository)
  properties = []
  custom_property_repository.all_custom_properties.sort_by(&:name).each do |p|
    properties << {
      name: p.name,
      value: p.value(nil),
      type: p.type.type,
      externalType: p.type.external_type
    }
  end
  properties
end
state_payload(seralized_flag_repository, serialized_custom_property_repository, device_properties, dev_mode_secret) click to toggle source
# File lib/rox/core/network/state_sender.rb, line 84
def self.state_payload(seralized_flag_repository, serialized_custom_property_repository, device_properties, dev_mode_secret)
  values = {}
  values[PropertyType::APP_KEY.name] = device_properties.all_properties[PropertyType::APP_KEY.name]
  values[PropertyType::PLATFORM.name] = device_properties.all_properties[PropertyType::PLATFORM.name]
  values.merge!(device_properties.all_properties)
  values.merge!({ feature_flags: seralized_flag_repository })
  values.merge!({ custom_properties: serialized_custom_property_repository })
  values['devModeSecret'] = dev_mode_secret
  values
end

Public Instance Methods

delayed_send() click to toggle source
# File lib/rox/core/network/state_sender.rb, line 24
def delayed_send
  @debouncer.call
end
dump_state() click to toggle source
# File lib/rox/core/network/state_sender.rb, line 57
def dump_state
  serialized_feature_flags = StateSender.seralize_flag_repository_with_values(@flag_repository)
  serialized_custom_properties = StateSender.serialize_custom_properties_repository_with_values(@custom_property_repository)
  StateSender.state_payload(serialized_feature_flags, serialized_custom_properties, @device_properties,
                            @sdk_settings.dev_mode_secret)
end
get_state_from_CDN(rollout_key, md5_signature) click to toggle source
# File lib/rox/core/network/state_sender.rb, line 64
def get_state_from_CDN(rollout_key, md5_signature)
  url_for_state_cdn =
    RequestData.new("#{Rox::Core::Environment.state_cdn_path}/#{rollout_key}/#{md5_signature}", {})
  @request.send_get(url_for_state_cdn)
end
send() click to toggle source
# File lib/rox/core/network/state_sender.rb, line 28
def send
  rollout_key = @device_properties.rollout_key
  serialized_feature_flags = StateSender.seralize_flag_repository(@flag_repository)
  serialized_custom_properties = StateSender.serialize_custom_properties_repository(@custom_property_repository)

  state_payload = StateSender.state_payload(serialized_feature_flags, serialized_custom_properties,
                                            @device_properties, @sdk_settings.dev_mode_secret)
  md5_signature = StateSender.md5_signature(serialized_feature_flags, serialized_custom_properties,
                                            @device_properties, @sdk_settings.dev_mode_secret)

  unless @device_properties.rox_options.self_managed?
    response = get_state_from_CDN(rollout_key, md5_signature)
    if response.success?
      Rox::Core::Logging.logger.debug('Successfully fetched state from CDN')
      return
    else
      Rox::Core::Logging.logger.debug('Failed to fetch state from CDN. Sending state to API...')
    end
  end

  response = send_state_to_API(rollout_key, md5_signature, state_payload)
  message = if response.success?
              'Successfully sent state to API.'
            else
              'Failed to send state to API.'
            end
  Rox::Core::Logging.logger.debug(message)
end
send_state_to_API(rollout_key, md5_signature, state_payload) click to toggle source
# File lib/rox/core/network/state_sender.rb, line 70
def send_state_to_API(rollout_key, md5_signature, state_payload)
  @request.send_post(
    "#{Rox::Core::Environment.state_api_path(@device_properties.rox_options.self_managed_options&.server_url)}/#{rollout_key}/#{md5_signature}", state_payload
  )
end