splitclient-rb 6.3.0 → 8.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/pull_request_template.md +9 -0
  4. data/.github/workflows/ci.yml +90 -0
  5. data/.github/workflows/update-license-year.yml +45 -0
  6. data/.gitignore +4 -0
  7. data/.rubocop.yml +46 -3
  8. data/CHANGES.txt +158 -11
  9. data/CONTRIBUTORS-GUIDE.md +49 -0
  10. data/LICENSE +169 -13
  11. data/NOTICE.txt +5 -0
  12. data/README.md +67 -27
  13. data/Rakefile +1 -8
  14. data/ext/murmurhash/3_x64_128.c +117 -0
  15. data/ext/murmurhash/murmurhash.c +5 -1
  16. data/lib/murmurhash/murmurhash.jar +0 -0
  17. data/lib/splitclient-rb/cache/adapters/cache_adapter.rb +3 -3
  18. data/lib/splitclient-rb/cache/adapters/memory_adapters/map_adapter.rb +4 -0
  19. data/lib/splitclient-rb/cache/adapters/memory_adapters/queue_adapter.rb +7 -0
  20. data/lib/splitclient-rb/cache/adapters/redis_adapter.rb +12 -4
  21. data/lib/splitclient-rb/cache/fetchers/segment_fetcher.rb +83 -0
  22. data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +70 -0
  23. data/lib/splitclient-rb/cache/filter/bloom_filter.rb +67 -0
  24. data/lib/splitclient-rb/cache/filter/filter_adapter.rb +32 -0
  25. data/lib/splitclient-rb/cache/filter/flag_set_filter.rb +40 -0
  26. data/lib/splitclient-rb/cache/hashers/impression_hasher.rb +34 -0
  27. data/lib/splitclient-rb/cache/observers/impression_observer.rb +22 -0
  28. data/lib/splitclient-rb/cache/observers/noop_impression_observer.rb +10 -0
  29. data/lib/splitclient-rb/cache/repositories/events/memory_repository.rb +26 -14
  30. data/lib/splitclient-rb/cache/repositories/events/redis_repository.rb +9 -14
  31. data/lib/splitclient-rb/cache/repositories/events_repository.rb +31 -10
  32. data/lib/splitclient-rb/cache/repositories/flag_sets/memory_repository.rb +40 -0
  33. data/lib/splitclient-rb/cache/repositories/flag_sets/redis_repository.rb +49 -0
  34. data/lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb +22 -23
  35. data/lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb +15 -22
  36. data/lib/splitclient-rb/cache/repositories/impressions_repository.rb +6 -31
  37. data/lib/splitclient-rb/cache/repositories/repository.rb +6 -5
  38. data/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb +136 -0
  39. data/lib/splitclient-rb/cache/repositories/segments_repository.rb +46 -6
  40. data/lib/splitclient-rb/cache/repositories/splits_repository.rb +232 -43
  41. data/lib/splitclient-rb/cache/routers/impression_router.rb +24 -22
  42. data/lib/splitclient-rb/cache/senders/events_sender.rb +12 -29
  43. data/lib/splitclient-rb/cache/senders/impressions_adapter/memory_sender.rb +71 -0
  44. data/lib/splitclient-rb/cache/senders/impressions_adapter/redis_sender.rb +69 -0
  45. data/lib/splitclient-rb/cache/senders/impressions_count_sender.rb +43 -0
  46. data/lib/splitclient-rb/cache/senders/impressions_formatter.rb +27 -13
  47. data/lib/splitclient-rb/cache/senders/impressions_sender.rb +11 -25
  48. data/lib/splitclient-rb/cache/senders/impressions_sender_adapter.rb +21 -0
  49. data/lib/splitclient-rb/cache/senders/localhost_repo_cleaner.rb +47 -0
  50. data/lib/splitclient-rb/cache/stores/localhost_split_builder.rb +95 -0
  51. data/lib/splitclient-rb/cache/stores/localhost_split_store.rb +110 -0
  52. data/lib/splitclient-rb/cache/stores/store_utils.rb +13 -0
  53. data/lib/splitclient-rb/clients/split_client.rb +385 -138
  54. data/lib/splitclient-rb/constants.rb +16 -0
  55. data/lib/splitclient-rb/engine/api/client.rb +38 -43
  56. data/lib/splitclient-rb/engine/api/events.rb +19 -11
  57. data/lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb +1 -0
  58. data/lib/splitclient-rb/engine/api/impressions.rb +49 -14
  59. data/lib/splitclient-rb/engine/api/segments.rb +31 -24
  60. data/lib/splitclient-rb/engine/api/splits.rb +108 -33
  61. data/lib/splitclient-rb/engine/api/telemetry_api.rb +47 -0
  62. data/lib/splitclient-rb/engine/auth_api_client.rb +96 -0
  63. data/lib/splitclient-rb/engine/back_off.rb +26 -0
  64. data/lib/splitclient-rb/engine/common/impressions_counter.rb +45 -0
  65. data/lib/splitclient-rb/engine/common/impressions_manager.rb +165 -0
  66. data/lib/splitclient-rb/engine/common/noop_impressions_counter.rb +27 -0
  67. data/lib/splitclient-rb/engine/events/events_delivery.rb +20 -0
  68. data/lib/splitclient-rb/engine/events/events_manager.rb +194 -0
  69. data/lib/splitclient-rb/engine/events/events_manager_config.rb +96 -0
  70. data/lib/splitclient-rb/engine/events/events_task.rb +50 -0
  71. data/lib/splitclient-rb/engine/events/noop_events_queue.rb +13 -0
  72. data/lib/splitclient-rb/engine/fallback_treatment_calculator.rb +48 -0
  73. data/lib/splitclient-rb/engine/impressions/noop_unique_keys_tracker.rb +17 -0
  74. data/lib/splitclient-rb/engine/impressions/unique_keys_tracker.rb +144 -0
  75. data/lib/splitclient-rb/engine/matchers/all_keys_matcher.rb +1 -1
  76. data/lib/splitclient-rb/engine/matchers/between_matcher.rb +7 -5
  77. data/lib/splitclient-rb/engine/matchers/between_semver_matcher.rb +33 -0
  78. data/lib/splitclient-rb/engine/matchers/combining_matcher.rb +10 -8
  79. data/lib/splitclient-rb/engine/matchers/contains_all_matcher.rb +2 -6
  80. data/lib/splitclient-rb/engine/matchers/contains_any_matcher.rb +1 -5
  81. data/lib/splitclient-rb/engine/matchers/contains_matcher.rb +7 -5
  82. data/lib/splitclient-rb/engine/matchers/dependency_matcher.rb +6 -5
  83. data/lib/splitclient-rb/engine/matchers/ends_with_matcher.rb +5 -4
  84. data/lib/splitclient-rb/engine/matchers/equal_to_boolean_matcher.rb +3 -2
  85. data/lib/splitclient-rb/engine/matchers/equal_to_matcher.rb +6 -4
  86. data/lib/splitclient-rb/engine/matchers/equal_to_semver_matcher.rb +28 -0
  87. data/lib/splitclient-rb/engine/matchers/equal_to_set_matcher.rb +1 -5
  88. data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_matcher.rb +6 -4
  89. data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_semver_matcher.rb +28 -0
  90. data/lib/splitclient-rb/engine/matchers/in_list_semver_matcher.rb +36 -0
  91. data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_matcher.rb +6 -4
  92. data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_semver_matcher.rb +28 -0
  93. data/lib/splitclient-rb/engine/matchers/matcher.rb +22 -0
  94. data/lib/splitclient-rb/engine/matchers/matches_string_matcher.rb +3 -2
  95. data/lib/splitclient-rb/engine/matchers/negation_matcher.rb +3 -2
  96. data/lib/splitclient-rb/engine/matchers/part_of_set_matcher.rb +2 -6
  97. data/lib/splitclient-rb/engine/matchers/prerequisites_matcher.rb +31 -0
  98. data/lib/splitclient-rb/engine/matchers/rule_based_segment_matcher.rb +78 -0
  99. data/lib/splitclient-rb/engine/matchers/semver.rb +201 -0
  100. data/lib/splitclient-rb/engine/matchers/set_matcher.rb +2 -1
  101. data/lib/splitclient-rb/engine/matchers/starts_with_matcher.rb +4 -3
  102. data/lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb +3 -2
  103. data/lib/splitclient-rb/engine/matchers/whitelist_matcher.rb +7 -5
  104. data/lib/splitclient-rb/engine/metrics/binary_search_latency_tracker.rb +3 -65
  105. data/lib/splitclient-rb/engine/models/evaluation_options.rb +9 -0
  106. data/lib/splitclient-rb/engine/models/event_active_subscriptions.rb +14 -0
  107. data/lib/splitclient-rb/engine/models/events_metadata.rb +10 -0
  108. data/lib/splitclient-rb/engine/models/fallback_treatment.rb +11 -0
  109. data/lib/splitclient-rb/engine/models/fallback_treatments_configuration.rb +36 -0
  110. data/lib/splitclient-rb/engine/models/label.rb +3 -0
  111. data/lib/splitclient-rb/engine/models/sdk_event.rb +4 -0
  112. data/lib/splitclient-rb/engine/models/sdk_event_type.rb +4 -0
  113. data/lib/splitclient-rb/engine/models/sdk_internal_event.rb +8 -0
  114. data/lib/splitclient-rb/engine/models/sdk_internal_event_notification.rb +14 -0
  115. data/lib/splitclient-rb/engine/models/segment_type.rb +4 -0
  116. data/lib/splitclient-rb/engine/models/split_http_response.rb +19 -0
  117. data/lib/splitclient-rb/engine/models/valid_sdk_event.rb +14 -0
  118. data/lib/splitclient-rb/engine/parser/condition.rb +81 -20
  119. data/lib/splitclient-rb/engine/parser/evaluator.rb +40 -51
  120. data/lib/splitclient-rb/engine/push_manager.rb +66 -0
  121. data/lib/splitclient-rb/engine/status_manager.rb +39 -0
  122. data/lib/splitclient-rb/engine/sync_manager.rb +180 -0
  123. data/lib/splitclient-rb/engine/synchronizer.rb +231 -0
  124. data/lib/splitclient-rb/exceptions.rb +20 -1
  125. data/lib/splitclient-rb/helpers/decryption_helper.rb +25 -0
  126. data/lib/splitclient-rb/helpers/evaluator_helper.rb +37 -0
  127. data/lib/splitclient-rb/helpers/repository_helper.rb +61 -0
  128. data/lib/splitclient-rb/helpers/thread_helper.rb +24 -0
  129. data/lib/splitclient-rb/helpers/util.rb +26 -0
  130. data/lib/splitclient-rb/managers/split_manager.rb +58 -20
  131. data/lib/splitclient-rb/spec.rb +9 -0
  132. data/lib/splitclient-rb/split_config.rb +336 -54
  133. data/lib/splitclient-rb/split_factory.rb +219 -33
  134. data/lib/splitclient-rb/split_factory_builder.rb +1 -22
  135. data/lib/splitclient-rb/split_factory_registry.rb +63 -0
  136. data/lib/splitclient-rb/split_logger.rb +9 -10
  137. data/lib/splitclient-rb/sse/event_source/client.rb +263 -0
  138. data/lib/splitclient-rb/sse/event_source/event_parser.rb +65 -0
  139. data/lib/splitclient-rb/sse/event_source/event_types.rb +15 -0
  140. data/lib/splitclient-rb/sse/event_source/stream_data.rb +22 -0
  141. data/lib/splitclient-rb/sse/notification_manager_keeper.rb +84 -0
  142. data/lib/splitclient-rb/sse/notification_processor.rb +48 -0
  143. data/lib/splitclient-rb/sse/sse_handler.rb +44 -0
  144. data/lib/splitclient-rb/sse/workers/segments_worker.rb +62 -0
  145. data/lib/splitclient-rb/sse/workers/splits_worker.rb +149 -0
  146. data/lib/splitclient-rb/telemetry/domain/constants.rb +48 -0
  147. data/lib/splitclient-rb/telemetry/domain/structs.rb +35 -0
  148. data/lib/splitclient-rb/telemetry/evaluation_consumer.rb +14 -0
  149. data/lib/splitclient-rb/telemetry/evaluation_producer.rb +21 -0
  150. data/lib/splitclient-rb/telemetry/init_consumer.rb +14 -0
  151. data/lib/splitclient-rb/telemetry/init_producer.rb +19 -0
  152. data/lib/splitclient-rb/telemetry/memory/memory_evaluation_consumer.rb +32 -0
  153. data/lib/splitclient-rb/telemetry/memory/memory_evaluation_producer.rb +24 -0
  154. data/lib/splitclient-rb/telemetry/memory/memory_init_consumer.rb +28 -0
  155. data/lib/splitclient-rb/telemetry/memory/memory_init_producer.rb +34 -0
  156. data/lib/splitclient-rb/telemetry/memory/memory_runtime_consumer.rb +119 -0
  157. data/lib/splitclient-rb/telemetry/memory/memory_runtime_producer.rb +87 -0
  158. data/lib/splitclient-rb/telemetry/memory/memory_synchronizer.rb +213 -0
  159. data/lib/splitclient-rb/telemetry/redis/redis_evaluation_producer.rb +38 -0
  160. data/lib/splitclient-rb/telemetry/redis/redis_init_producer.rb +37 -0
  161. data/lib/splitclient-rb/telemetry/redis/redis_synchronizer.rb +27 -0
  162. data/lib/splitclient-rb/telemetry/runtime_consumer.rb +25 -0
  163. data/lib/splitclient-rb/telemetry/runtime_producer.rb +25 -0
  164. data/lib/splitclient-rb/telemetry/storages/memory.rb +159 -0
  165. data/lib/splitclient-rb/telemetry/sync_task.rb +36 -0
  166. data/lib/splitclient-rb/telemetry/synchronizer.rb +33 -0
  167. data/lib/splitclient-rb/utilitites.rb +8 -0
  168. data/lib/splitclient-rb/validators.rb +142 -38
  169. data/lib/splitclient-rb/version.rb +1 -1
  170. data/lib/splitclient-rb.rb +101 -16
  171. data/sonar-project.properties +6 -0
  172. data/splitclient-rb.gemspec +28 -23
  173. metadata +262 -82
  174. data/.travis.yml +0 -11
  175. data/Appraisals +0 -10
  176. data/Detailed-README.md +0 -588
  177. data/NEWS +0 -141
  178. data/lib/splitclient-rb/cache/repositories/metrics/memory_repository.rb +0 -127
  179. data/lib/splitclient-rb/cache/repositories/metrics/redis_repository.rb +0 -96
  180. data/lib/splitclient-rb/cache/repositories/metrics_repository.rb +0 -21
  181. data/lib/splitclient-rb/cache/senders/metrics_sender.rb +0 -56
  182. data/lib/splitclient-rb/cache/stores/sdk_blocker.rb +0 -46
  183. data/lib/splitclient-rb/cache/stores/segment_store.rb +0 -81
  184. data/lib/splitclient-rb/cache/stores/split_store.rb +0 -102
  185. data/lib/splitclient-rb/clients/localhost_split_client.rb +0 -183
  186. data/lib/splitclient-rb/engine/api/faraday_adapter/patched_net_http_persistent.rb +0 -46
  187. data/lib/splitclient-rb/engine/api/metrics.rb +0 -60
  188. data/lib/splitclient-rb/engine/metrics/metrics.rb +0 -80
  189. data/lib/splitclient-rb/engine/parser/split_adapter.rb +0 -81
  190. data/lib/splitclient-rb/localhost_split_factory.rb +0 -13
  191. data/lib/splitclient-rb/localhost_utils.rb +0 -59
  192. data/lib/splitclient-rb/managers/localhost_split_manager.rb +0 -60
@@ -2,15 +2,6 @@ require 'logger'
2
2
  require 'socket'
3
3
 
4
4
  module SplitIoClient
5
-
6
- class << self
7
- attr_accessor :configuration
8
- end
9
-
10
- def self.configure(opts={})
11
- self.configuration ||= SplitConfig.new(opts)
12
- end
13
-
14
5
  #
15
6
  # This class manages configuration options for the split client library.
16
7
  # If not custom configuration is required the default configuration values will be used
@@ -26,7 +17,6 @@ module SplitIoClient
26
17
  # @option opts [Int] :connection_timeout (2) The connect timeout for network connections in seconds.
27
18
  # @option opts [Int] :features_refresh_rate The SDK polls Split servers for changes to feature roll-out plans. This parameter controls this polling period in seconds.
28
19
  # @option opts [Int] :segments_refresh_rate
29
- # @option opts [Int] :metrics_refresh_rate
30
20
  # @option opts [Int] :impressions_refresh_rate
31
21
  # @option opts [Object] :logger a logger to user for messages from the client. Defaults to stdout
32
22
  # @option opts [Boolean] :debug_enabled (false) The value for the debug flag
@@ -41,39 +31,44 @@ module SplitIoClient
41
31
  @events_uri = (opts[:events_uri] || SplitConfig.default_events_uri).chomp('/')
42
32
  @mode = opts[:mode] || SplitConfig.default_mode
43
33
  @redis_url = opts[:redis_url] || SplitConfig.default_redis_url
44
- @redis_namespace = opts[:redis_namespace] ? "#{opts[:redis_namespace]}.#{SplitConfig.default_redis_namespace}" : SplitConfig.default_redis_namespace
34
+ @redis_namespace = opts[:redis_namespace] && opts[:redis_namespace].to_s.length > 0 ? "#{opts[:redis_namespace]}.#{SplitConfig.default_redis_namespace}" : SplitConfig.default_redis_namespace
45
35
  @cache_adapter = SplitConfig.init_cache_adapter(
46
36
  opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter, nil, @redis_url
47
37
  )
48
38
  @connection_timeout = opts[:connection_timeout] || SplitConfig.default_connection_timeout
49
39
  @read_timeout = opts[:read_timeout] || SplitConfig.default_read_timeout
50
- @features_refresh_rate = opts[:features_refresh_rate] || SplitConfig.default_features_refresh_rate
40
+
41
+ @logger = opts[:logger] || SplitConfig.default_logger
42
+
43
+ if(opts[:reload_rate])
44
+ @features_refresh_rate = opts[:reload_rate]
45
+ @logger.warn('Localhost mode: reload_rate will be deprecated soon in favor of ' \
46
+ 'features_refresh_rate. Take a look in our documentation.'
47
+ )
48
+ else
49
+ @features_refresh_rate = opts[:features_refresh_rate] || SplitConfig.default_features_refresh_rate
50
+ end
51
+
51
52
  @segments_refresh_rate = opts[:segments_refresh_rate] || SplitConfig.default_segments_refresh_rate
52
- @metrics_refresh_rate = opts[:metrics_refresh_rate] || SplitConfig.default_metrics_refresh_rate
53
53
 
54
- @impressions_refresh_rate = opts[:impressions_refresh_rate] || SplitConfig.default_impressions_refresh_rate
54
+ @impressions_mode = init_impressions_mode(opts[:impressions_mode], opts[:cache_adapter])
55
+
56
+ @impressions_refresh_rate = SplitConfig.init_impressions_refresh_rate(@impressions_mode, opts[:impressions_refresh_rate], SplitConfig.default_impressions_refresh_rate)
55
57
  @impressions_queue_size = opts[:impressions_queue_size] || SplitConfig.default_impressions_queue_size
56
58
  @impressions_adapter = SplitConfig.init_cache_adapter(
57
59
  opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @impressions_queue_size, @redis_url
58
60
  )
59
61
  #Safeguard for users of older SDK versions.
60
- @disable_impressions = @impressions_queue_size == -1
61
- #Safeguard for users of older SDK versions.
62
62
  @impressions_bulk_size = opts[:impressions_bulk_size] || @impressions_queue_size > 0 ? @impressions_queue_size : 0
63
63
 
64
- @metrics_adapter = SplitConfig.init_cache_adapter(
65
- opts[:cache_adapter] || SplitConfig.default_cache_adapter, :map_adapter, nil, @redis_url
66
- )
67
-
68
- @logger = opts[:logger] || SplitConfig.default_logger
69
64
  @debug_enabled = opts[:debug_enabled] || SplitConfig.default_debug
70
65
  @transport_debug_enabled = opts[:transport_debug_enabled] || SplitConfig.default_debug
71
- @block_until_ready = opts[:ready] || opts[:block_until_ready] || 0
66
+ @block_until_ready = SplitConfig.default_block_until_ready
72
67
 
73
- @logger.warn 'no ready parameter has been set - incorrect control treatments could be logged' if block_until_ready == 0 && !mode.equal?(:consumer)
68
+ @ip_addresses_enabled = opts[:ip_addresses_enabled].nil? ? SplitConfig.default_ip_addresses_enabled : opts[:ip_addresses_enabled]
74
69
 
75
- @machine_name = opts[:machine_name] || SplitConfig.machine_hostname
76
- @machine_ip = opts[:machine_ip] || SplitConfig.machine_ip
70
+ @machine_name = SplitConfig.machine_hostname(@ip_addresses_enabled, opts[:machine_name], opts[:cache_adapter] || SplitConfig.default_cache_adapter)
71
+ @machine_ip = SplitConfig.machine_ip(@ip_addresses_enabled, opts[:machine_ip], opts[:cache_adapter] || SplitConfig.default_cache_adapter)
77
72
 
78
73
  @cache_ttl = opts[:cache_ttl] || SplitConfig.cache_ttl
79
74
  @max_cache_size = opts[:max_cache_size] || SplitConfig.max_cache_size
@@ -95,8 +90,41 @@ module SplitIoClient
95
90
  @events_adapter = SplitConfig.init_cache_adapter(
96
91
  opts[:cache_adapter] || SplitConfig.default_cache_adapter, :queue_adapter, @events_queue_size, @redis_url
97
92
  )
93
+
94
+ @telemetry_adapter = SplitConfig.init_telemetry_adapter(
95
+ opts[:cache_adapter] || SplitConfig.default_cache_adapter, @redis_url
96
+ )
97
+
98
+ @split_file = opts[:split_file] || SplitConfig.default_split_file
99
+
98
100
  @valid_mode = true
101
+ @split_logger = SplitIoClient::SplitLogger.new(self)
102
+ @split_validator = SplitIoClient::Validators.new(self)
103
+ @localhost_mode = opts[:localhost_mode]
104
+
105
+ @streaming_enabled = consumer? ? false : (opts[:streaming_enabled].nil? ? SplitConfig.default_streaming_enabled : opts[:streaming_enabled])
106
+ @streaming_service_url = opts[:streaming_service_url] || SplitConfig.default_streaming_service_url
107
+ @auth_service_url = opts[:auth_service_url] || SplitConfig.default_auth_service_url
108
+ @auth_retry_back_off_base = SplitConfig.init_auth_retry_back_off(opts[:auth_retry_back_off_base] || SplitConfig.default_auth_retry_back_off_base)
109
+ @streaming_reconnect_back_off_base = SplitConfig.init_streaming_reconnect_back_off(opts[:streaming_reconnect_back_off_base] || SplitConfig.default_streaming_reconnect_back_off_base)
99
110
 
111
+ @telemetry_refresh_rate = SplitConfig.init_telemetry_refresh_rate(opts[:telemetry_refresh_rate])
112
+ @telemetry_service_url = opts[:telemetry_service_url] || SplitConfig.default_telemetry_service_url
113
+
114
+ @unique_keys_refresh_rate = SplitConfig.default_unique_keys_refresh_rate(@cache_adapter)
115
+ # @unique_keys_cache_max_size = SplitConfig.default_unique_keys_cache_max_size
116
+ @unique_keys_bulk_size = SplitConfig.default_unique_keys_bulk_size(@cache_adapter)
117
+
118
+ @counter_refresh_rate = SplitConfig.default_counter_refresh_rate(@cache_adapter)
119
+
120
+ @sdk_start_time = Time.now.to_f
121
+
122
+ @on_demand_fetch_retry_delay_seconds = SplitConfig.default_on_demand_fetch_retry_delay_seconds
123
+ @on_demand_fetch_max_retries = SplitConfig.default_on_demand_fetch_max_retries
124
+
125
+ @flag_sets_filter = SplitConfig.sanitize_flag_set_filter(opts[:flag_sets_filter], @split_validator, opts[:cache_adapter], @logger)
126
+
127
+ @fallback_treatments_configuration = SplitConfig.sanitize_fallback_config(opts[:fallback_treatments], @split_validator, @logger)
100
128
  startup_log
101
129
  end
102
130
 
@@ -135,12 +163,6 @@ module SplitIoClient
135
163
  # @return [Object] Impressions adapter instance
136
164
  attr_accessor :impressions_adapter
137
165
 
138
- #
139
- # The cache adapter to store metrics in
140
- #
141
- # @return [Symbol] Metrics adapter
142
- attr_accessor :metrics_adapter
143
-
144
166
  #
145
167
  # The cache adapter to store events in
146
168
  #
@@ -160,6 +182,20 @@ module SplitIoClient
160
182
  # @return [Logger] The configured logger
161
183
  attr_accessor :logger
162
184
 
185
+ #
186
+ # The split logger. The client library uses the split logger
187
+ # to use common functions around the logger
188
+ #
189
+ # @return [SplitLogger] The configured logger
190
+ attr_accessor :split_logger
191
+
192
+ #
193
+ # The split validator. The client library uses the split validator
194
+ # to validate inputs accross the sdk
195
+ #
196
+ # @return [SplitValidator] The validator
197
+ attr_accessor :split_validator
198
+
163
199
  #
164
200
  # The boolean that represents the state of the debug log level
165
201
  #
@@ -197,19 +233,17 @@ module SplitIoClient
197
233
 
198
234
  attr_accessor :features_refresh_rate
199
235
  attr_accessor :segments_refresh_rate
200
- attr_accessor :metrics_refresh_rate
201
236
  attr_accessor :impressions_refresh_rate
202
237
 
203
238
  attr_accessor :impression_listener
204
239
  attr_accessor :impression_listener_refresh_rate
205
240
 
206
241
  #
207
- # How big the impressions queue is before dropping impressions. -1 to disable it.
242
+ # How big the impressions queue is before dropping impressions
208
243
  #
209
244
  # @return [Integer]
210
245
  attr_accessor :impressions_queue_size
211
246
  attr_accessor :impressions_bulk_size
212
- attr_accessor :disable_impressions
213
247
 
214
248
  attr_accessor :redis_url
215
249
  attr_accessor :redis_namespace
@@ -230,6 +264,118 @@ module SplitIoClient
230
264
  # @return [Integer]
231
265
  attr_accessor :events_queue_size
232
266
 
267
+ attr_accessor :split_file
268
+
269
+ attr_accessor :localhost_mode
270
+
271
+ attr_accessor :ip_addresses_enabled
272
+
273
+ attr_accessor :auth_service_url
274
+
275
+ attr_accessor :auth_retry_back_off_base
276
+
277
+ attr_accessor :streaming_service_url
278
+
279
+ attr_accessor :streaming_reconnect_back_off_base
280
+
281
+ attr_accessor :streaming_enabled
282
+
283
+ attr_accessor :impressions_mode
284
+
285
+ attr_accessor :telemetry_adapter
286
+
287
+ attr_accessor :telemetry_refresh_rate
288
+
289
+ attr_accessor :telemetry_service_url
290
+
291
+ attr_accessor :sdk_start_time
292
+
293
+ attr_accessor :on_demand_fetch_retry_delay_seconds
294
+ attr_accessor :on_demand_fetch_max_retries
295
+
296
+ attr_accessor :unique_keys_refresh_rate
297
+ #attr_accessor :unique_keys_cache_max_size
298
+ attr_accessor :unique_keys_bulk_size
299
+
300
+ attr_accessor :counter_refresh_rate
301
+
302
+ #
303
+ # Flagsets filter
304
+ #
305
+ # @return [Array]
306
+ attr_accessor :flag_sets_filter
307
+
308
+ attr_accessor :fallback_treatments_configuration
309
+
310
+ def self.default_counter_refresh_rate(adapter)
311
+ return 300 if adapter == :redis # Send bulk impressions count - Refresh rate: 5 min.
312
+
313
+ 1800 # Send bulk impressions count - Refresh rate: 30 min.
314
+ end
315
+
316
+ def self.default_on_demand_fetch_retry_delay_seconds
317
+ 0.05
318
+ end
319
+
320
+ def self.default_on_demand_fetch_max_retries
321
+ 10
322
+ end
323
+
324
+ def init_impressions_mode(impressions_mode, adapter)
325
+ case impressions_mode
326
+ when :optimized
327
+ return :optimized
328
+ when :none
329
+ return :none
330
+ when :debug
331
+ return :debug
332
+ else
333
+ default = adapter == :redis ? :debug : :optimized
334
+ @logger.error("You passed an invalid impressions_mode, impressions_mode should be one of the following values: :debug, :optimized or :none. Defaulting to #{default} mode") unless impressions_mode.nil?
335
+ return default
336
+ end
337
+ end
338
+
339
+ def self.init_impressions_refresh_rate(impressions_mode, refresh_rate, default_rate)
340
+ return (refresh_rate.nil? || refresh_rate <= 0 ? default_rate : refresh_rate) if impressions_mode == :debug
341
+
342
+ return refresh_rate.nil? || refresh_rate <= 0 ? SplitConfig.default_impressions_refresh_rate_optimized : [default_rate, refresh_rate].max
343
+ end
344
+
345
+ def self.init_telemetry_refresh_rate(refresh_rate)
346
+ return SplitConfig.default_telemetry_refresh_rate if refresh_rate.nil? || refresh_rate < 60
347
+
348
+ refresh_rate
349
+ end
350
+
351
+ def self.default_streaming_enabled
352
+ true
353
+ end
354
+
355
+ def self.default_streaming_service_url
356
+ 'https://streaming.split.io/event-stream'
357
+ end
358
+
359
+ def self.default_auth_service_url
360
+ 'https://auth.split.io/api/v2/auth'
361
+ end
362
+
363
+ def self.default_auth_retry_back_off_base
364
+ 1
365
+ end
366
+
367
+ def self.default_streaming_reconnect_back_off_base
368
+ 1
369
+ end
370
+
371
+ def self.init_auth_retry_back_off(auth_retry_back_off)
372
+ auth_retry_back_off < 1 ? SplitConfig.default_auth_retry_back_off_base : auth_retry_back_off
373
+ end
374
+
375
+ def self.init_streaming_reconnect_back_off(streaming_reconnect_back_off)
376
+ streaming_reconnect_back_off < 1 ? SplitConfig.default_streaming_reconnect_back_off_base : streaming_reconnect_back_off
377
+ end
378
+
233
379
  #
234
380
  # The default split client configuration
235
381
  #
@@ -265,6 +411,21 @@ module SplitIoClient
265
411
  end
266
412
  end
267
413
 
414
+ def self.init_telemetry_adapter(adapter, redis_url)
415
+ case adapter
416
+ when :memory
417
+ Telemetry::Storages::Memory.new
418
+ when :redis
419
+ begin
420
+ require 'redis'
421
+ rescue LoadError
422
+ fail StandardError, 'To use Redis as a cache adapter you must include it in your Gemfile'
423
+ end
424
+
425
+ SplitIoClient::Cache::Adapters::RedisAdapter.new(redis_url)
426
+ end
427
+ end
428
+
268
429
  def self.map_memory_adapter(name, queue_size)
269
430
  case name
270
431
  when :map_adapter
@@ -283,10 +444,6 @@ module SplitIoClient
283
444
  :memory
284
445
  end
285
446
 
286
- def self.default_metrics_adapter
287
- :memory
288
- end
289
-
290
447
  #
291
448
  # The default read timeout value
292
449
  #
@@ -304,19 +461,19 @@ module SplitIoClient
304
461
  end
305
462
 
306
463
  def self.default_features_refresh_rate
307
- 5
464
+ 60
308
465
  end
309
466
 
310
467
  def self.default_segments_refresh_rate
311
468
  60
312
469
  end
313
470
 
314
- def self.default_metrics_refresh_rate
471
+ def self.default_impressions_refresh_rate
315
472
  60
316
473
  end
317
474
 
318
- def self.default_impressions_refresh_rate
319
- 60
475
+ def self.default_impressions_refresh_rate_optimized
476
+ 300
320
477
  end
321
478
 
322
479
  def self.default_impression_listener_refresh_rate
@@ -335,6 +492,47 @@ module SplitIoClient
335
492
  500
336
493
  end
337
494
 
495
+ def self.default_telemetry_refresh_rate
496
+ 3600
497
+ end
498
+
499
+ def self.default_unique_keys_refresh_rate(adapter)
500
+ return 300 if adapter == :redis
501
+
502
+ 900
503
+ end
504
+
505
+ # def self.default_unique_keys_cache_max_size
506
+ # 30000
507
+ # end
508
+
509
+ def self.default_unique_keys_bulk_size(adapter)
510
+ return 2000 if adapter == :redis
511
+
512
+ 5000
513
+ end
514
+
515
+ def self.default_telemetry_service_url
516
+ 'https://telemetry.split.io/api/v1'
517
+ end
518
+
519
+ def self.default_split_file
520
+ File.join(Dir.home, '.split')
521
+ end
522
+
523
+ def self.default_offline_refresh_rate
524
+ 5
525
+ end
526
+
527
+ def self.sanitize_flag_set_filter(flag_sets, validator, adapter, logger)
528
+ return [] if flag_sets.nil?
529
+ if adapter == :redis
530
+ logger.warn("config: : flag_sets_filter is not applicable for Consumer modes where the SDK does not keep rollout data in sync. FlagSet filter was discarded")
531
+ return []
532
+ end
533
+ return validator.valid_flag_sets(:config, flag_sets)
534
+ end
535
+
338
536
  #
339
537
  # The default logger object
340
538
  #
@@ -343,14 +541,12 @@ module SplitIoClient
343
541
  if defined?(Rails) && Rails.logger
344
542
  Rails.logger
345
543
  elsif ENV['SPLITCLIENT_ENV'] == 'test'
346
- Logger.new('/dev/null')
544
+ Logger.new('/dev/null')
347
545
  else
348
546
  Logger.new($stdout)
349
547
  end
350
548
  end
351
549
 
352
-
353
-
354
550
  #
355
551
  # The default debug value
356
552
  #
@@ -375,6 +571,22 @@ module SplitIoClient
375
571
  'SPLITIO'
376
572
  end
377
573
 
574
+ #
575
+ # The default block until ready value
576
+ #
577
+ # @return [int]
578
+ def self.default_block_until_ready
579
+ 15
580
+ end
581
+
582
+ #
583
+ # The default ip addresses enabled value
584
+ #
585
+ # @return [boolean]
586
+ def self.default_ip_addresses_enabled
587
+ true
588
+ end
589
+
378
590
  #
379
591
  # The default transport_debug_enabled value
380
592
  #
@@ -429,27 +641,97 @@ module SplitIoClient
429
641
  @logger.info("Loaded cache class: #{@cache_adapter.class}")
430
642
  end
431
643
 
644
+ def standalone?
645
+ @mode.equal?(:standalone)
646
+ end
647
+
648
+ def consumer?
649
+ @mode.equal?(:consumer)
650
+ end
651
+
652
+ def sdk_url_overriden?
653
+ return @base_uri != SplitConfig.default_base_uri
654
+ end
655
+
432
656
  #
433
657
  # gets the hostname where the sdk gem is running
434
658
  #
435
659
  # @return [string]
436
- def self.machine_hostname
437
- Socket.gethostname
438
- rescue
439
- 'localhost'.freeze
660
+ def self.machine_hostname(ip_addresses_enabled, machine_name, adapter)
661
+ if ip_addresses_enabled
662
+ begin
663
+ return machine_name || Socket.gethostname
664
+ rescue
665
+ return 'unknown'.freeze
666
+ end
667
+ else
668
+ case adapter
669
+ when :redis
670
+ return 'NA'.freeze
671
+ end
672
+ end
673
+
674
+ return ''.freeze
440
675
  end
441
676
 
442
677
  #
443
678
  # gets the ip where the sdk gem is running
444
679
  #
445
680
  # @return [string]
446
- def self.machine_ip
447
- loopback_ip = Socket.ip_address_list.find { |ip| ip.ipv4_loopback? }
448
- private_ip = Socket.ip_address_list.find { |ip| ip.ipv4_private? }
681
+ def self.machine_ip(ip_addresses_enabled, ip, adapter)
682
+ if ip_addresses_enabled
683
+ begin
684
+ return ip unless ip.nil? || ip.to_s.empty?
449
685
 
450
- addr_info = private_ip || loopback_ip
686
+ loopback_ip = Socket.ip_address_list.find { |ip| ip.ipv4_loopback? }
687
+ private_ip = Socket.ip_address_list.find { |ip| ip.ipv4_private? }
688
+
689
+ addr_info = private_ip || loopback_ip
690
+
691
+ return addr_info.ip_address
692
+ rescue
693
+ return 'unknown'.freeze
694
+ end
695
+ else
696
+ case adapter
697
+ when :redis
698
+ return 'NA'.freeze
699
+ end
700
+ end
701
+
702
+ return ''.freeze
703
+ end
704
+
705
+ def self.sanitize_fallback_config(fallback_config, validator, logger)
706
+ return fallback_config if fallback_config.nil?
707
+
708
+ processed = Engine::Models::FallbackTreatmentsConfiguration.new
709
+ if !fallback_config.is_a?(Engine::Models::FallbackTreatmentsConfiguration)
710
+ logger.warn('Config: fallbackTreatments parameter should be of `FallbackTreatmentsConfiguration` class.')
711
+ return processed
712
+ end
713
+
714
+ sanitized_global_fallback_treatment = fallback_config.global_fallback_treatment
715
+ if !fallback_config.global_fallback_treatment.nil? && !validator.validate_fallback_treatment('Config', fallback_config.global_fallback_treatment)
716
+ logger.warn('Config: global fallbacktreatment parameter is discarded.')
717
+ sanitized_global_fallback_treatment = nil
718
+ end
719
+
720
+ sanitized_flag_fallback_treatments = nil
721
+ if !fallback_config.by_flag_fallback_treatment.nil? && fallback_config.by_flag_fallback_treatment.is_a?(Hash)
722
+ sanitized_flag_fallback_treatments = Hash.new
723
+ for feature_name in fallback_config.by_flag_fallback_treatment.keys()
724
+ if !validator.valid_split_name?('Config', feature_name) || !validator.validate_fallback_treatment('Config', fallback_config.by_flag_fallback_treatment[feature_name])
725
+ logger.warn("Config: fallback treatment parameter for feature flag #{feature_name} is discarded.")
726
+ next
727
+ end
728
+
729
+ sanitized_flag_fallback_treatments[feature_name] = fallback_config.by_flag_fallback_treatment[feature_name]
730
+ end
731
+ end
732
+ processed = Engine::Models::FallbackTreatmentsConfiguration.new(sanitized_global_fallback_treatment, sanitized_flag_fallback_treatments)
451
733
 
452
- addr_info.ip_address
734
+ processed
453
735
  end
454
736
  end
455
737
  end