Class: FeatureHub::Sdk::FeatureHubConfig

Inherits:
Object
  • Object
show all
Defined in:
lib/feature_hub/sdk/feature_hub_config.rb

Overview

central dispatch class for FeatureHub SDK

Constant Summary collapse

FALLBACK_ENVIRONMENT_ID =
"569b0129-d53d-4516-a818-9154af601047"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(edge_url = nil, api_keys = nil, repository = nil, edge_provider = nil, logger = nil) ⇒ FeatureHubConfig

rubocop:disable Metrics/ParameterLists



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 32

def initialize(edge_url = nil, api_keys = nil, repository = nil, edge_provider = nil, logger = nil) # rubocop:disable Metrics/ParameterLists
  @logger = logger
  @repository = repository || FeatureHub::Sdk::FeatureHubRepository.new(nil, @logger)

  @closed = false

  resolved_url = resolve_edge_url(edge_url)
  resolved_keys = resolve_api_keys(api_keys)

  if resolved_url && resolved_keys && !resolved_keys.empty?
    detect_client_evaluated(resolved_keys)
    @edge_url = parse_edge_url(resolved_url)
    @api_keys = resolved_keys
    @edge_service_provider = edge_provider || method(:create_default_provider)
  else
    @edge_url = nil
    @api_keys = []
    @client_evaluated = false
    @edge_service_provider = edge_provider || method(:create_null_provider)
  end
end

Instance Attribute Details

#api_keysObject (readonly)

Returns the value of attribute api_keys.



30
31
32
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 30

def api_keys
  @api_keys
end

#client_evaluatedObject (readonly)

Returns the value of attribute client_evaluated.



30
31
32
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 30

def client_evaluated
  @client_evaluated
end

#edge_urlObject (readonly)

Returns the value of attribute edge_url.



30
31
32
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 30

def edge_url
  @edge_url
end

#loggerObject (readonly)

Returns the value of attribute logger.



30
31
32
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 30

def logger
  @logger
end

Instance Method Details

#closeObject



131
132
133
134
135
136
137
138
139
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 131

def close
  unless @repository.nil?
    @logger&.info("[featurehubsdk] repository now closed")
    @repository.close
    @repository = nil
  end

  close_edge
end

#close_edgeObject



141
142
143
144
145
146
147
148
149
150
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 141

def close_edge
  return if @closed

  @logger&.info("[featurehubsdk] edge now closed")
  @closed = true
  return if @edge_service.nil?

  @edge_service.close
  @edge_service = nil
end

#edge_service_provider(edge_provider = nil) ⇒ Object

rubocop:enable Naming/AccessorMethodName



99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 99

def edge_service_provider(edge_provider = nil)
  return nil if @closed
  return @edge_service_provider if edge_provider.nil?

  @edge_service_provider = edge_provider

  if @edge_service
    @edge_service&.close
    @edge_service = nil
  end

  edge_provider
end

#environment_idObject



152
153
154
155
156
157
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 152

def environment_id
  return FALLBACK_ENVIRONMENT_ID if @api_keys.empty?

  parts = @api_keys.first.split("/")
  parts.length == 3 ? parts[1] : parts[0]
end

#feature(key, attrs = nil) ⇒ Object



58
59
60
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 58

def feature(key, attrs = nil)
  @repository.feature(key, attrs)
end

#force_new_edge_serviceObject



80
81
82
83
84
85
86
87
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 80

def force_new_edge_service
  if @edge_service
    @edge_service&.close
    @edge_service = nil
  end

  get_or_create_edge_service
end

#get_or_create_edge_serviceObject

rubocop:disable Naming/AccessorMethodName



90
91
92
93
94
95
96
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 90

def get_or_create_edge_service
  return nil if @closed

  @edge_service = create_edge_service if @edge_service.nil?

  @edge_service
end

#initObject



75
76
77
78
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 75

def init
  get_or_create_edge_service.poll
  self
end

#new_contextObject



119
120
121
122
123
124
125
126
127
128
129
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 119

def new_context
  get_or_create_edge_service

  edge_service = @closed ? nil : @edge_service

  if @client_evaluated
    ClientEvalFeatureContext.new(@repository, edge_service)
  else
    ServerEvalFeatureContext.new(@repository, edge_service)
  end
end

#register_interceptor(interceptor) ⇒ Object



66
67
68
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 66

def register_interceptor(interceptor)
  @repository.register_interceptor(interceptor)
end

#register_raw_update_listener(listener) ⇒ Object



70
71
72
73
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 70

def register_raw_update_listener(listener)
  @repository ||= FeatureHub::Sdk::FeatureHubRepository.new(nil, @logger)
  @repository.register_raw_update_listener(listener)
end

#repository(repo = nil) ⇒ Object



54
55
56
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 54

def repository(repo = nil)
  @repository = repo || @repository
end

#use_polling_edge_service(interval = ENV.fetch("FEATUREHUB_POLL_INTERVAL", ENV.fetch("FEATUREHUB_POLLING_INTERVAL", "30")).to_i) ⇒ Object



113
114
115
116
117
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 113

def use_polling_edge_service(interval = ENV.fetch("FEATUREHUB_POLL_INTERVAL",
                                                  ENV.fetch("FEATUREHUB_POLLING_INTERVAL", "30")).to_i)
  @interval = interval
  @edge_service_provider = method(:create_polling_edge_provider)
end

#value(key, default_value = nil, attrs = nil) ⇒ Object



62
63
64
# File 'lib/feature_hub/sdk/feature_hub_config.rb', line 62

def value(key, default_value = nil, attrs = nil)
  @repository.value(key, default_value, attrs)
end