class Rox::Core::ConfigurationParser

Public Class Methods

new(signature_verifier, error_reporter, configuration_fetched_invoker) click to toggle source
# File lib/rox/core/configuration/configuration_parser.rb, line 13
def initialize(signature_verifier, error_reporter, configuration_fetched_invoker)
  @signature_verifier = signature_verifier
  @error_reporter = error_reporter
  @configuration_fetched_invoker = configuration_fetched_invoker
end

Public Instance Methods

parse(fetch_result, sdk_settings) click to toggle source
# File lib/rox/core/configuration/configuration_parser.rb, line 19
def parse(fetch_result, sdk_settings)
  if fetch_result.nil? || fetch_result.data.nil? || fetch_result.data.empty?
    @configuration_fetched_invoker.invoke_error(FetcherError::EMPTY_JSON)
    @error_reporter.report('Failed to parse JSON configuration - Null Or Empty', ArgumentError.new('data'))
    return nil
  end

  begin
    json_obj = JSON.parse(fetch_result.data)
  rescue StandardError => e
    @configuration_fetched_invoker.invoke_error(FetcherError::CORRUPTED_JSON)
    @error_reporter.report('Failed to parse JSON configuration', e)
    return nil
  end

  if fetch_result.source != ConfigurationSource::ROXY && !@signature_verifier.verify(json_obj['data'],
                                                                                     json_obj['signature_v0'])
    @configuration_fetched_invoker.invoke_error(FetcherError::SIGNATURE_VERIFICATION_ERROR)
    @error_reporter.report('Failed to validate signature',
                           StandardError.new("Data : #{json_obj['data']} Signature : #{json_obj['signature_v0']}"))
    return nil
  end

  signature_date = DateTime.rfc3339(json_obj['signed_date']).to_time
  internal_data_string = json_obj['data']
  internal_data_object = JSON.parse(internal_data_string)

  if fetch_result.source != ConfigurationSource::ROXY && internal_data_object['application'] != sdk_settings.api_key
    @configuration_fetched_invoker.invoke_error(FetcherError::MISMATCH_APP_KEY)
    @error_reporter.report('Failed to parse JSON configuration - ',
                           StandardError.new("Internal Data: #{internal_data_object['application']} SdkSettings: #{sdk_settings.api_key}"))
    return nil
  end

  experiments = parse_experiments(internal_data_object)
  target_groups = parse_target_groups(internal_data_object)

  Configuration.new(experiments, target_groups, signature_date)
rescue StandardError => e
  Logging.logger.error('Failed to parse configurations', e)
  @configuration_fetched_invoker.invoke_error(FetcherError::UNKNOWN)
  nil
end
parse_experiment(data) click to toggle source
# File lib/rox/core/configuration/configuration_parser.rb, line 67
def parse_experiment(data)
  condition = data['deploymentConfiguration']['condition']
  is_archived = data['archived']
  name = data['name']
  id = data['_id']
  labels = data['labels'] || []
  flags = data['featureFlags'].map { |f| f['name'] }
  ExperimentModel.new(id, name, condition, is_archived, flags, labels)
end
parse_experiments(data) click to toggle source
# File lib/rox/core/configuration/configuration_parser.rb, line 63
def parse_experiments(data)
  data['experiments'].map { |e| parse_experiment(e) }
end
parse_target_group(data) click to toggle source
# File lib/rox/core/configuration/configuration_parser.rb, line 81
def parse_target_group(data)
  TargetGroupModel.new(data['_id'], data['condition'])
end
parse_target_groups(data) click to toggle source
# File lib/rox/core/configuration/configuration_parser.rb, line 77
def parse_target_groups(data)
  data['targetGroups'].map { |g| parse_target_group(g) }
end