Skip to content

Commit e60474c

Browse files
authored
chore: Allow individual http settings in fdv2 (#361)
1 parent 852d994 commit e60474c

18 files changed

Lines changed: 408 additions & 180 deletions

contract-tests/client_entity.rb

Lines changed: 67 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ def initialize(log, config)
3232
polling = init_config[:polling]
3333
next unless polling
3434

35-
opts[:base_uri] = polling[:baseUri] if polling[:baseUri]
36-
set_optional_time_prop(polling, :pollIntervalMs, opts, :poll_interval)
37-
initializers << LaunchDarkly::DataSystem.polling_ds_builder
35+
initializers << build_polling_ds_builder(polling)
3836
end
3937
data_system.initializers(initializers)
4038
end
@@ -44,41 +42,13 @@ def initialize(log, config)
4442
primary = sync_config[:primary]
4543
secondary = sync_config[:secondary]
4644

47-
primary_builder = nil
48-
secondary_builder = nil
49-
50-
if primary
51-
streaming = primary[:streaming]
52-
if streaming
53-
opts[:stream_uri] = streaming[:baseUri] if streaming[:baseUri]
54-
set_optional_time_prop(streaming, :initialRetryDelayMs, opts, :initial_reconnect_delay)
55-
primary_builder = LaunchDarkly::DataSystem.streaming_ds_builder
56-
elsif primary[:polling]
57-
polling = primary[:polling]
58-
opts[:base_uri] = polling[:baseUri] if polling[:baseUri]
59-
set_optional_time_prop(polling, :pollIntervalMs, opts, :poll_interval)
60-
primary_builder = LaunchDarkly::DataSystem.polling_ds_builder
61-
end
62-
end
63-
64-
if secondary
65-
streaming = secondary[:streaming]
66-
if streaming
67-
opts[:stream_uri] = streaming[:baseUri] if streaming[:baseUri]
68-
set_optional_time_prop(streaming, :initialRetryDelayMs, opts, :initial_reconnect_delay)
69-
secondary_builder = LaunchDarkly::DataSystem.streaming_ds_builder
70-
elsif secondary[:polling]
71-
polling = secondary[:polling]
72-
opts[:base_uri] = polling[:baseUri] if polling[:baseUri]
73-
set_optional_time_prop(polling, :pollIntervalMs, opts, :poll_interval)
74-
secondary_builder = LaunchDarkly::DataSystem.polling_ds_builder
75-
end
76-
end
45+
primary_builder = build_synchronizer_builder(primary)
46+
secondary_builder = build_synchronizer_builder(secondary)
7747

7848
data_system.synchronizers(primary_builder, secondary_builder) if primary_builder
7949

8050
if primary_builder || secondary_builder
81-
fallback_builder = LaunchDarkly::DataSystem.fdv1_fallback_ds_builder
51+
fallback_builder = build_fdv1_fallback_builder(primary, secondary)
8252
data_system.fdv1_compatible_synchronizer(fallback_builder)
8353
end
8454
end
@@ -313,6 +283,69 @@ def close
313283
LaunchDarkly::LDContext.create(context)
314284
end
315285

286+
#
287+
# Builds a synchronizer builder from the contract test configuration.
288+
#
289+
# @param sync_config [Hash, nil] The synchronizer configuration (primary or secondary)
290+
# @return [Object, nil] Returns the configured builder or nil
291+
#
292+
private def build_synchronizer_builder(sync_config)
293+
return nil unless sync_config
294+
295+
streaming = sync_config[:streaming]
296+
if streaming
297+
build_streaming_ds_builder(streaming)
298+
elsif sync_config[:polling]
299+
build_polling_ds_builder(sync_config[:polling])
300+
end
301+
end
302+
303+
#
304+
# Builds a streaming data source builder with the configured parameters.
305+
#
306+
# @param streaming_config [Hash] The streaming configuration
307+
# @return [Object] Returns the configured streaming builder
308+
#
309+
private def build_streaming_ds_builder(streaming_config)
310+
builder = LaunchDarkly::DataSystem.streaming_ds_builder
311+
builder.base_uri(streaming_config[:baseUri]) if streaming_config[:baseUri]
312+
builder.initial_reconnect_delay(streaming_config[:initialRetryDelayMs] / 1_000.0) if streaming_config[:initialRetryDelayMs]
313+
builder
314+
end
315+
316+
#
317+
# Builds a polling data source builder with the configured parameters.
318+
#
319+
# @param polling_config [Hash] The polling configuration
320+
# @return [Object] Returns the configured polling builder
321+
#
322+
private def build_polling_ds_builder(polling_config)
323+
builder = LaunchDarkly::DataSystem.polling_ds_builder
324+
builder.base_uri(polling_config[:baseUri]) if polling_config[:baseUri]
325+
builder.poll_interval(polling_config[:pollIntervalMs] / 1_000.0) if polling_config[:pollIntervalMs]
326+
builder
327+
end
328+
329+
#
330+
# Builds an FDv1 fallback polling data source builder using the first available config.
331+
#
332+
# @param primary [Hash, nil] The primary synchronizer configuration
333+
# @param secondary [Hash, nil] The secondary synchronizer configuration
334+
# @return [Object] Returns the configured FDv1 fallback builder
335+
#
336+
private def build_fdv1_fallback_builder(primary, secondary)
337+
builder = LaunchDarkly::DataSystem.fdv1_fallback_ds_builder
338+
339+
# Use the first available polling config for the fallback base_uri
340+
polling_config = primary&.dig(:polling) || secondary&.dig(:polling)
341+
if polling_config
342+
builder.base_uri(polling_config[:baseUri]) if polling_config[:baseUri]
343+
builder.poll_interval(polling_config[:pollIntervalMs] / 1_000.0) if polling_config[:pollIntervalMs]
344+
end
345+
346+
builder
347+
end
348+
316349
#
317350
# Builds a persistent data store from the contract test configuration.
318351
#

lib/ldclient-rb/config.rb

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
require "logger"
22
require "ldclient-rb/impl/cache_store"
3+
require "ldclient-rb/impl/data_system/http_config_options"
4+
require "ldclient-rb/impl/data_system/polling"
5+
require "ldclient-rb/impl/data_system/streaming"
36

47
module LaunchDarkly
58
#
@@ -465,15 +468,15 @@ def self.default_capacity
465468
# @return [String] "https://sdk.launchdarkly.com"
466469
#
467470
def self.default_base_uri
468-
"https://sdk.launchdarkly.com"
471+
Impl::DataSystem::PollingDataSourceBuilder::DEFAULT_BASE_URI
469472
end
470473

471474
#
472475
# The default value for {#stream_uri}.
473476
# @return [String] "https://stream.launchdarkly.com"
474477
#
475478
def self.default_stream_uri
476-
"https://stream.launchdarkly.com"
479+
Impl::DataSystem::StreamingDataSourceBuilder::DEFAULT_BASE_URI
477480
end
478481

479482
#
@@ -505,23 +508,23 @@ def self.default_flush_interval
505508
# @return [Float] 10
506509
#
507510
def self.default_read_timeout
508-
10
511+
Impl::DataSystem::HttpConfigOptions::DEFAULT_READ_TIMEOUT
509512
end
510513

511514
#
512515
# The default value for {#initial_reconnect_delay}.
513516
# @return [Float] 1
514517
#
515518
def self.default_initial_reconnect_delay
516-
1
519+
Impl::DataSystem::StreamingDataSourceBuilder::DEFAULT_INITIAL_RECONNECT_DELAY
517520
end
518521

519522
#
520523
# The default value for {#connect_timeout}.
521524
# @return [Float] 2
522525
#
523526
def self.default_connect_timeout
524-
2
527+
Impl::DataSystem::HttpConfigOptions::DEFAULT_CONNECT_TIMEOUT
525528
end
526529

527530
#
@@ -575,7 +578,7 @@ def self.default_offline
575578
# @return [Float] 30
576579
#
577580
def self.default_poll_interval
578-
30
581+
Impl::DataSystem::PollingDataSourceBuilder::DEFAULT_POLL_INTERVAL
579582
end
580583

581584
#
@@ -699,13 +702,13 @@ def initialize(store:, context_cache_size: nil, context_cache_time: nil, status_
699702
#
700703
class DataSystemConfig
701704
#
702-
# @param initializers [Array<Proc(Config) => LaunchDarkly::Interfaces::DataSystem::Initializer>, nil] The (optional) array of builder procs
703-
# @param primary_synchronizer [Proc(Config) => LaunchDarkly::Interfaces::DataSystem::Synchronizer, nil] The (optional) builder proc for primary synchronizer
704-
# @param secondary_synchronizer [Proc(Config) => LaunchDarkly::Interfaces::DataSystem::Synchronizer, nil] The (optional) builder proc for secondary synchronizer
705+
# @param initializers [Array<#build(String, Config)>, nil] The (optional) array of builders
706+
# @param primary_synchronizer [#build(String, Config), nil] The (optional) builder for primary synchronizer
707+
# @param secondary_synchronizer [#build(String, Config), nil] The (optional) builder for secondary synchronizer
705708
# @param data_store_mode [Symbol] The (optional) data store mode
706709
# @param data_store [LaunchDarkly::Interfaces::FeatureStore, nil] The (optional) data store
707-
# @param fdv1_fallback_synchronizer [Proc(Config) => LaunchDarkly::Interfaces::DataSystem::Synchronizer, nil]
708-
# The (optional) builder proc for FDv1-compatible fallback synchronizer
710+
# @param fdv1_fallback_synchronizer [#build(String, Config), nil]
711+
# The (optional) builder for FDv1-compatible fallback synchronizer
709712
#
710713
def initialize(initializers: nil, primary_synchronizer: nil, secondary_synchronizer: nil,
711714
data_store_mode: LaunchDarkly::Interfaces::DataSystem::DataStoreMode::READ_ONLY, data_store: nil, fdv1_fallback_synchronizer: nil)
@@ -717,16 +720,16 @@ def initialize(initializers: nil, primary_synchronizer: nil, secondary_synchroni
717720
@fdv1_fallback_synchronizer = fdv1_fallback_synchronizer
718721
end
719722

720-
# The initializers for the data system. Each proc takes sdk_key and Config and returns an Initializer.
721-
# @return [Array<Proc(String, Config) => LaunchDarkly::Interfaces::DataSystem::Initializer>, nil]
723+
# The initializers for the data system. Each builder responds to build(sdk_key, config) and returns an Initializer.
724+
# @return [Array<#build(String, Config)>, nil]
722725
attr_reader :initializers
723726

724-
# The primary synchronizer builder. Takes sdk_key and Config and returns a Synchronizer.
725-
# @return [Proc(String, Config) => LaunchDarkly::Interfaces::DataSystem::Synchronizer, nil]
727+
# The primary synchronizer builder. Responds to build(sdk_key, config) and returns a Synchronizer.
728+
# @return [#build(String, Config), nil]
726729
attr_reader :primary_synchronizer
727730

728-
# The secondary synchronizer builder. Takes sdk_key and Config and returns a Synchronizer.
729-
# @return [Proc(String, Config) => LaunchDarkly::Interfaces::DataSystem::Synchronizer, nil]
731+
# The secondary synchronizer builder. Responds to build(sdk_key, config) and returns a Synchronizer.
732+
# @return [#build(String, Config), nil]
730733
attr_reader :secondary_synchronizer
731734

732735
# The data store mode.
@@ -737,8 +740,8 @@ def initialize(initializers: nil, primary_synchronizer: nil, secondary_synchroni
737740
# @return [LaunchDarkly::Interfaces::FeatureStore, nil]
738741
attr_reader :data_store
739742

740-
# The FDv1-compatible fallback synchronizer builder. Takes sdk_key and Config and returns a Synchronizer.
741-
# @return [Proc(String, Config) => LaunchDarkly::Interfaces::DataSystem::Synchronizer, nil]
743+
# The FDv1-compatible fallback synchronizer builder. Responds to build(sdk_key, config) and returns a Synchronizer.
744+
# @return [#build(String, Config), nil]
742745
attr_reader :fdv1_fallback_synchronizer
743746
end
744747
end

lib/ldclient-rb/data_system.rb

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ def initialize
2828
#
2929
# Sets the initializers for the data system.
3030
#
31-
# @param initializers [Array<Proc(String, Config) => LaunchDarkly::Interfaces::DataSystem::Initializer>]
32-
# Array of builder procs that take sdk_key and Config and return an Initializer
31+
# @param initializers [Array<#build(String, Config)>]
32+
# Array of builders that respond to build(sdk_key, config) and return an Initializer
3333
# @return [ConfigBuilder] self for chaining
3434
#
3535
def initializers(initializers)
@@ -40,9 +40,8 @@ def initializers(initializers)
4040
#
4141
# Sets the synchronizers for the data system.
4242
#
43-
# @param primary [Proc(String, Config) => LaunchDarkly::Interfaces::DataSystem::Synchronizer] Builder proc that takes sdk_key and Config and returns the primary Synchronizer
44-
# @param secondary [Proc(String, Config) => LaunchDarkly::Interfaces::DataSystem::Synchronizer, nil]
45-
# Builder proc that takes sdk_key and Config and returns the secondary Synchronizer
43+
# @param primary [#build(String, Config)] Builder that responds to build(sdk_key, config) and returns the primary Synchronizer
44+
# @param secondary [#build(String, Config), nil] Builder that responds to build(sdk_key, config) and returns the secondary Synchronizer
4645
# @return [ConfigBuilder] self for chaining
4746
#
4847
def synchronizers(primary, secondary = nil)
@@ -55,8 +54,7 @@ def synchronizers(primary, secondary = nil)
5554
# Configures the SDK with a fallback synchronizer that is compatible with
5655
# the Flag Delivery v1 API.
5756
#
58-
# @param fallback [Proc(String, Config) => LaunchDarkly::Interfaces::DataSystem::Synchronizer]
59-
# Builder proc that takes sdk_key and Config and returns the fallback Synchronizer
57+
# @param fallback [#build(String, Config)] Builder that responds to build(sdk_key, config) and returns the fallback Synchronizer
6058
# @return [ConfigBuilder] self for chaining
6159
#
6260
def fdv1_compatible_synchronizer(fallback)
@@ -100,42 +98,36 @@ def build
10098
end
10199

102100
#
103-
# Returns a builder proc for creating a polling data source.
101+
# Returns a builder for creating a polling data source.
104102
# This is a building block that can be used with {ConfigBuilder#initializers}
105103
# or {ConfigBuilder#synchronizers} to create custom data system configurations.
106104
#
107-
# @return [Proc] A proc that takes (sdk_key, config) and returns a polling data source
105+
# @return [LaunchDarkly::Impl::DataSystem::PollingDataSourceBuilder]
108106
#
109107
def self.polling_ds_builder
110-
lambda do |sdk_key, config|
111-
LaunchDarkly::Impl::DataSystem::PollingDataSourceBuilder.new(sdk_key, config).build
112-
end
108+
LaunchDarkly::Impl::DataSystem::PollingDataSourceBuilder.new
113109
end
114110

115111
#
116-
# Returns a builder proc for creating an FDv1 fallback polling data source.
112+
# Returns a builder for creating an FDv1 fallback polling data source.
117113
# This is a building block that can be used with {ConfigBuilder#fdv1_compatible_synchronizer}
118114
# to provide FDv1 compatibility in custom data system configurations.
119115
#
120-
# @return [Proc] A proc that takes (sdk_key, config) and returns an FDv1 polling data source
116+
# @return [LaunchDarkly::Impl::DataSystem::FDv1PollingDataSourceBuilder]
121117
#
122118
def self.fdv1_fallback_ds_builder
123-
lambda do |sdk_key, config|
124-
LaunchDarkly::Impl::DataSystem::FDv1PollingDataSourceBuilder.new(sdk_key, config).build
125-
end
119+
LaunchDarkly::Impl::DataSystem::FDv1PollingDataSourceBuilder.new
126120
end
127121

128122
#
129-
# Returns a builder proc for creating a streaming data source.
123+
# Returns a builder for creating a streaming data source.
130124
# This is a building block that can be used with {ConfigBuilder#synchronizers}
131125
# to create custom data system configurations.
132126
#
133-
# @return [Proc] A proc that takes (sdk_key, config) and returns a streaming data source
127+
# @return [LaunchDarkly::Impl::DataSystem::StreamingDataSourceBuilder]
134128
#
135129
def self.streaming_ds_builder
136-
lambda do |sdk_key, config|
137-
LaunchDarkly::Impl::DataSystem::StreamingDataSourceBuilder.new(sdk_key, config).build
138-
end
130+
LaunchDarkly::Impl::DataSystem::StreamingDataSourceBuilder.new
139131
end
140132

141133
#

lib/ldclient-rb/events.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ def initialize(sdk_key, config, client = nil, diagnostic_accumulator = nil, test
156156
@inbox_full = Concurrent::AtomicBoolean.new(false)
157157

158158
event_sender = (test_properties || {})[:event_sender] ||
159-
Impl::EventSender.new(sdk_key, config, client || Impl::Util.new_http_client(config.events_uri, config))
159+
Impl::EventSender.new(sdk_key, config)
160160

161161
@timestamp_fn = (test_properties || {})[:timestamp_fn] || proc { Impl::Util.current_time_millis }
162162
@omit_anonymous_contexts = config.omit_anonymous_contexts

lib/ldclient-rb/impl/data_source/requestor.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
require "ldclient-rb/impl/model/serialization"
22
require "ldclient-rb/impl/util"
3+
require "ldclient-rb/impl/data_system/http_config_options"
34

45
require "concurrent/atomics"
56
require "json"
@@ -26,7 +27,13 @@ class Requestor
2627
def initialize(sdk_key, config)
2728
@sdk_key = sdk_key
2829
@config = config
29-
@http_client = Impl::Util.new_http_client(config.base_uri, config)
30+
@http_config = DataSystem::HttpConfigOptions.new(
31+
base_uri: config.base_uri,
32+
socket_factory: config.socket_factory,
33+
read_timeout: config.read_timeout,
34+
connect_timeout: config.connect_timeout
35+
)
36+
@http_client = Impl::Util.new_http_client(@http_config)
3037
.use(:auto_inflate)
3138
.headers("Accept-Encoding" => "gzip")
3239
@cache = @config.cache_store
@@ -48,7 +55,7 @@ def stop
4855

4956
def make_request(path)
5057
uri = URI(
51-
Util.add_payload_filter_key(@config.base_uri + path, @config)
58+
Util.add_payload_filter_key(@http_config.base_uri + path, @config)
5259
)
5360
headers = {}
5461
Impl::Util.default_http_headers(@sdk_key, @config).each { |k, v| headers[k] = v }

0 commit comments

Comments
 (0)