class StatsigDriver

Public Class Methods

new(secret_key, options = nil) click to toggle source
Calls superclass method
# File lib/statsig_driver.rb, line 11
def initialize(secret_key, options = nil)
  super()
  if !secret_key.is_a?(String) || !secret_key.start_with?('secret-')
    raise 'Invalid secret key provided. Provide your project secret key from the Statsig console'
  end
  if !options.nil? && !options.instance_of?(StatsigOptions)
    raise 'Invalid options provided. Either provide a valid StatsigOptions object or nil'
  end

  @options = options || StatsigOptions.new()
  @shutdown = false
  @secret_key = secret_key
  @net = Network.new(secret_key, @options.api_url_base)
  @statsig_metadata = {
    'sdkType' => 'ruby-server',
    'sdkVersion' => Gem::Specification::load('statsig.gemspec')&.version,
  }
  @logger = StatsigLogger.new(@net, @statsig_metadata)

  downloaded_specs = @net.download_config_specs
  unless downloaded_specs.nil?
    @initialized = true
  end

  @store = SpecStore.new(downloaded_specs)
  @evaluator = Evaluator.new(@store)

  @polling_thread = @net.poll_for_changes(-> (config_specs) { @store.process(config_specs) })
end

Public Instance Methods

check_gate(user, gate_name) click to toggle source
# File lib/statsig_driver.rb, line 41
def check_gate(user, gate_name)
  validate_user(user)
  user = normalize_user(user)
  if !gate_name.is_a?(String) || gate_name.empty?
    raise 'Invalid gate_name provided'
  end
  check_shutdown
  unless @initialized
    return false
  end

  res = @evaluator.check_gate(user, gate_name)
  if res.nil?
    res = ConfigResult.new(gate_name)
  end

  if res == $fetch_from_server
    res = check_gate_fallback(user, gate_name)
    # exposure logged by the server
  else
    @logger.log_gate_exposure(user, res.name, res.gate_value, res.rule_id)
  end

  res.gate_value
end
get_config(user, dynamic_config_name) click to toggle source
# File lib/statsig_driver.rb, line 67
def get_config(user, dynamic_config_name)
  validate_user(user)
  user = normalize_user(user)
  if !dynamic_config_name.is_a?(String) || dynamic_config_name.empty?
    raise "Invalid dynamic_config_name provided"
  end
  check_shutdown
  unless @initialized
    return DynamicConfig.new(dynamic_config_name)
  end

  res = @evaluator.get_config(user, dynamic_config_name)
  if res.nil?
    res = ConfigResult.new(dynamic_config_name)
  end

  if res == $fetch_from_server
    res = get_config_fallback(user, dynamic_config_name)
    # exposure logged by the server
  else
    @logger.log_config_exposure(user, res.name, res.rule_id)
  end

  DynamicConfig.new(res.name, res.json_value, res.rule_id)
end
log_event(user, event_name, value = nil, metadata = nil) click to toggle source
# File lib/statsig_driver.rb, line 93
def log_event(user, event_name, value = nil, metadata = nil)
  if !user.nil? && !user.instance_of?(StatsigUser)
    raise 'Must provide a valid StatsigUser or nil'
  end
  check_shutdown

  user = normalize_user(user)

  event = StatsigEvent.new(event_name)
  event.user = user
  event.value = value
  event.metadata = metadata
  event.statsig_metadata = @statsig_metadata
  @logger.log_event(event)
end
shutdown() click to toggle source
# File lib/statsig_driver.rb, line 109
def shutdown
  @shutdown = true
  @logger.flush(true)
  @polling_thread&.exit
end

Private Instance Methods

check_gate_fallback(user, gate_name) click to toggle source
# File lib/statsig_driver.rb, line 136
def check_gate_fallback(user, gate_name)
  network_result = @net.check_gate(user, gate_name)
  if network_result.nil?
    config_result = ConfigResult.new(gate_name)
    return config_result
  end

  ConfigResult.new(
    network_result['name'],
    network_result['value'],
    {},
    network_result['rule_id'],
  )
end
check_shutdown() click to toggle source
# File lib/statsig_driver.rb, line 130
def check_shutdown
  if @shutdown
    puts 'SDK has been shutdown.  Updates in the Statsig Console will no longer reflect.'
  end
end
get_config_fallback(user, dynamic_config_name) click to toggle source
# File lib/statsig_driver.rb, line 151
def get_config_fallback(user, dynamic_config_name)
  network_result = @net.get_config(user, dynamic_config_name)
  if network_result.nil?
    config_result = ConfigResult.new(dynamic_config_name)
    return config_result
  end

  ConfigResult.new(
    network_result['name'],
    false,
    network_result['value'],
    network_result['rule_id'],
  )
end
normalize_user(user) click to toggle source
# File lib/statsig_driver.rb, line 123
def normalize_user(user)
  if !@options&.environment.nil?
    user.statsig_environment = @options.environment
  end
  user
end
validate_user(user) click to toggle source
# File lib/statsig_driver.rb, line 117
def validate_user(user)
  if user.nil? || !user.instance_of?(StatsigUser) || !user.user_id.is_a?(String)
    raise 'Must provide a valid StatsigUser with a user_id to use the server SDK. See https://docs.statsig.com/messages/serverRequiredUserID/ for more details.'
  end
end