launchdarkly-server-sdk 8.9.0-java → 8.10.1-java

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9461ca8bff58d47677e9209382c92cebdd7fa68d64e61cab5b938857a5b6ebba
4
- data.tar.gz: cacb2d985cb3ac490d9b518affa546ffd7551f2a5696dbf754b21f7cd19fa8c7
3
+ metadata.gz: 4c5fe6a0e62f48081b547cb0b150afaa5af481ffc6e8ce7b8c35fb36fe415fd5
4
+ data.tar.gz: 7697cfbf1eed13b72432bf01c5705ee99ef9c3598936b92deba743174c320ff9
5
5
  SHA512:
6
- metadata.gz: d19da9233a4f26438fb788c9dfb264b0d82bfd697e556f7f92ae7e51852a87a378d2bba9a62b6214e707d394b51972bbbbf0135cc7321019d12bf2df17006042
7
- data.tar.gz: 249ea71e0b58245af526d29b2202bc39ca5ef5cbb5b1487e09714940dfbced30d8291701f5b5e0911deaf5cced1647f7ece061d604da699367f0948934d85e5e
6
+ metadata.gz: 9154c80e0b476748f6ad3ddc3ac1822224f5b95059e23d772e27f6beeac80ddaae52a05b3a5efa1611c6c51ea32d644eccb210d222b49d2874ad6d2aee7fd87a
7
+ data.tar.gz: 8fffa3869d6542497482cbc408a4935030b93a400cc5a127b26cde0498da65f438bc07c4da7397eca8c81c16970fa38e501a5ef52567d7b6900453e89a25f094
data/README.md CHANGED
@@ -16,7 +16,7 @@ LaunchDarkly overview
16
16
  Supported Ruby versions
17
17
  -----------------------
18
18
 
19
- This version of the LaunchDarkly SDK has a minimum Ruby version of 2.5.0, or 9.2.0 for JRuby.
19
+ This version of the LaunchDarkly SDK has a minimum Ruby version of 3.0.0, or 9.3.0 for JRuby.
20
20
 
21
21
  Getting started
22
22
  -----------
@@ -81,6 +81,7 @@ module LaunchDarkly
81
81
  @hooks = (opts[:hooks] || []).keep_if { |hook| hook.is_a? Interfaces::Hooks::Hook }
82
82
  @omit_anonymous_contexts = opts.has_key?(:omit_anonymous_contexts) && opts[:omit_anonymous_contexts]
83
83
  @data_source_update_sink = nil
84
+ @instance_id = nil
84
85
  end
85
86
 
86
87
  #
@@ -97,6 +98,18 @@ module LaunchDarkly
97
98
  #
98
99
  attr_accessor :data_source_update_sink
99
100
 
101
+
102
+ #
103
+ # Returns the unique identifier for this instance of the SDK.
104
+ #
105
+ # This property should only be set by the SDK. Long term access of this
106
+ # property is not supported; it is temporarily being exposed to maintain
107
+ # backwards compatibility while the SDK structure is updated.
108
+ #
109
+ # @private
110
+ #
111
+ attr_accessor :instance_id
112
+
100
113
  #
101
114
  # The base URL for the LaunchDarkly server. This is configurable mainly for testing
102
115
  # purposes; most users should use the default value.
@@ -10,6 +10,7 @@ module LaunchDarkly
10
10
  class ConsulFeatureStoreCore
11
11
  begin
12
12
  require "diplomat"
13
+ require "ostruct"
13
14
  CONSUL_ENABLED = true
14
15
  rescue ScriptError, StandardError
15
16
  CONSUL_ENABLED = false
@@ -11,6 +11,9 @@ module LaunchDarkly
11
11
 
12
12
  def self.default_http_headers(sdk_key, config)
13
13
  ret = { "Authorization" => sdk_key, "User-Agent" => "RubyClient/" + LaunchDarkly::VERSION }
14
+
15
+ ret["X-LaunchDarkly-Instance-Id"] = config.instance_id unless config.instance_id.nil?
16
+
14
17
  if config.wrapper_name
15
18
  ret["X-LaunchDarkly-Wrapper"] = config.wrapper_name +
16
19
  (config.wrapper_version ? "/" + config.wrapper_version : "")
@@ -13,6 +13,7 @@ require "concurrent/atomics"
13
13
  require "digest/sha1"
14
14
  require "forwardable"
15
15
  require "logger"
16
+ require "securerandom"
16
17
  require "benchmark"
17
18
  require "json"
18
19
  require "openssl"
@@ -56,25 +57,57 @@ module LaunchDarkly
56
57
  end
57
58
 
58
59
  @sdk_key = sdk_key
59
- @hooks = Concurrent::Array.new(config.hooks)
60
+ config.instance_id = SecureRandom.uuid
61
+ @config = config
62
+
63
+ start_up(wait_for_sec)
64
+ end
65
+
66
+ #
67
+ # Re-initializes an existing client after a process fork.
68
+ #
69
+ # The SDK relies on multiple background threads to operate correctly. When a process forks, `these threads are not
70
+ # available to the child <https://apidock.com/ruby/Process/fork/class>`.
71
+ #
72
+ # As a result, the SDK will not function correctly in the child process until it is re-initialized.
73
+ #
74
+ # This method is effectively equivalent to instantiating a new client. Future iterations of the SDK will provide
75
+ # increasingly efficient re-initializing improvements.
76
+ #
77
+ # Note that any configuration provided to the SDK will need to survive the forking process independently. For this
78
+ # reason, it is recommended that any listener or hook integrations be added postfork unless you are certain it can
79
+ # survive the forking process.
80
+ #
81
+ # @param wait_for_sec [Float] maximum time (in seconds) to wait for initialization
82
+ #
83
+ def postfork(wait_for_sec = 5)
84
+ @data_source = nil
85
+ @event_processor = nil
86
+ @big_segment_store_manager = nil
87
+
88
+ start_up(wait_for_sec)
89
+ end
90
+
91
+ private def start_up(wait_for_sec)
92
+ @hooks = Concurrent::Array.new(@config.hooks)
60
93
 
61
94
  @shared_executor = Concurrent::SingleThreadExecutor.new
62
95
 
63
- data_store_broadcaster = LaunchDarkly::Impl::Broadcaster.new(@shared_executor, config.logger)
96
+ data_store_broadcaster = LaunchDarkly::Impl::Broadcaster.new(@shared_executor, @config.logger)
64
97
  store_sink = LaunchDarkly::Impl::DataStore::UpdateSink.new(data_store_broadcaster)
65
98
 
66
99
  # We need to wrap the feature store object with a FeatureStoreClientWrapper in order to add
67
100
  # some necessary logic around updates. Unfortunately, we have code elsewhere that accesses
68
101
  # the feature store through the Config object, so we need to make a new Config that uses
69
102
  # the wrapped store.
70
- @store = Impl::FeatureStoreClientWrapper.new(config.feature_store, store_sink, config.logger)
71
- updated_config = config.clone
103
+ @store = Impl::FeatureStoreClientWrapper.new(@config.feature_store, store_sink, @config.logger)
104
+ updated_config = @config.clone
72
105
  updated_config.instance_variable_set(:@feature_store, @store)
73
106
  @config = updated_config
74
107
 
75
108
  @data_store_status_provider = LaunchDarkly::Impl::DataStore::StatusProvider.new(@store, store_sink)
76
109
 
77
- @big_segment_store_manager = Impl::BigSegmentStoreManager.new(config.big_segments, @config.logger)
110
+ @big_segment_store_manager = Impl::BigSegmentStoreManager.new(@config.big_segments, @config.logger)
78
111
  @big_segment_store_status_provider = @big_segment_store_manager.status_provider
79
112
 
80
113
  get_flag = lambda { |key| @store.get(FEATURES, key) }
@@ -83,7 +116,7 @@ module LaunchDarkly
83
116
  @evaluator = LaunchDarkly::Impl::Evaluator.new(get_flag, get_segment, get_big_segments_membership, @config.logger)
84
117
 
85
118
  if !@config.offline? && @config.send_events && !@config.diagnostic_opt_out?
86
- diagnostic_accumulator = Impl::DiagnosticAccumulator.new(Impl::DiagnosticAccumulator.create_diagnostic_id(sdk_key))
119
+ diagnostic_accumulator = Impl::DiagnosticAccumulator.new(Impl::DiagnosticAccumulator.create_diagnostic_id(@sdk_key))
87
120
  else
88
121
  diagnostic_accumulator = nil
89
122
  end
@@ -91,7 +124,7 @@ module LaunchDarkly
91
124
  if @config.offline? || !@config.send_events
92
125
  @event_processor = NullEventProcessor.new
93
126
  else
94
- @event_processor = EventProcessor.new(sdk_key, config, nil, diagnostic_accumulator)
127
+ @event_processor = EventProcessor.new(@sdk_key, @config, nil, diagnostic_accumulator)
95
128
  end
96
129
 
97
130
  if @config.use_ldd?
@@ -115,9 +148,9 @@ module LaunchDarkly
115
148
  # Currently, data source factories take two parameters unless they need to be aware of diagnostic_accumulator, in
116
149
  # which case they take three parameters. This will be changed in the future to use a less awkware mechanism.
117
150
  if data_source_or_factory.arity == 3
118
- @data_source = data_source_or_factory.call(sdk_key, @config, diagnostic_accumulator)
151
+ @data_source = data_source_or_factory.call(@sdk_key, @config, diagnostic_accumulator)
119
152
  else
120
- @data_source = data_source_or_factory.call(sdk_key, @config)
153
+ @data_source = data_source_or_factory.call(@sdk_key, @config)
121
154
  end
122
155
  else
123
156
  @data_source = data_source_or_factory
@@ -1,3 +1,3 @@
1
1
  module LaunchDarkly
2
- VERSION = "8.9.0" # x-release-please-version
2
+ VERSION = "8.10.1" # x-release-please-version
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: launchdarkly-server-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.9.0
4
+ version: 8.10.1
5
5
  platform: java
6
6
  authors:
7
7
  - LaunchDarkly
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-03-13 00:00:00.000000000 Z
10
+ date: 2025-06-13 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: aws-sdk-dynamodb
@@ -24,109 +24,115 @@ dependencies:
24
24
  - !ruby/object:Gem::Version
25
25
  version: '1.57'
26
26
  - !ruby/object:Gem::Dependency
27
- name: rexml
27
+ name: bundler
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: '3.3'
32
+ version: '2.2'
33
33
  - - ">="
34
34
  - !ruby/object:Gem::Version
35
- version: 3.3.7
35
+ version: 2.2.3
36
36
  type: :development
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
- version: '3.3'
42
+ version: '2.2'
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- version: 3.3.7
45
+ version: 2.2.3
46
46
  - !ruby/object:Gem::Dependency
47
- name: bundler
47
+ name: connection_pool
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  requirements:
50
- - - '='
50
+ - - "~>"
51
51
  - !ruby/object:Gem::Version
52
- version: 2.2.33
52
+ version: '2.3'
53
53
  type: :development
54
54
  prerelease: false
55
55
  version_requirements: !ruby/object:Gem::Requirement
56
56
  requirements:
57
- - - '='
57
+ - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: 2.2.33
59
+ version: '2.3'
60
60
  - !ruby/object:Gem::Dependency
61
- name: simplecov
61
+ name: diplomat
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: '0.21'
66
+ version: '2.6'
67
67
  type: :development
68
68
  prerelease: false
69
69
  version_requirements: !ruby/object:Gem::Requirement
70
70
  requirements:
71
71
  - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: '0.21'
73
+ version: '2.6'
74
74
  - !ruby/object:Gem::Dependency
75
- name: rspec
75
+ name: listen
76
76
  requirement: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - "~>"
79
79
  - !ruby/object:Gem::Version
80
- version: '3.10'
80
+ version: '3.3'
81
81
  type: :development
82
82
  prerelease: false
83
83
  version_requirements: !ruby/object:Gem::Requirement
84
84
  requirements:
85
85
  - - "~>"
86
86
  - !ruby/object:Gem::Version
87
- version: '3.10'
87
+ version: '3.3'
88
88
  - !ruby/object:Gem::Dependency
89
- name: diplomat
89
+ name: redis
90
90
  requirement: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: '2.6'
94
+ version: '5.0'
95
95
  type: :development
96
96
  prerelease: false
97
97
  version_requirements: !ruby/object:Gem::Requirement
98
98
  requirements:
99
99
  - - "~>"
100
100
  - !ruby/object:Gem::Version
101
- version: '2.6'
101
+ version: '5.0'
102
102
  - !ruby/object:Gem::Dependency
103
- name: redis
103
+ name: rexml
104
104
  requirement: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - "~>"
107
107
  - !ruby/object:Gem::Version
108
- version: '5.0'
108
+ version: '3.3'
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: 3.3.7
109
112
  type: :development
110
113
  prerelease: false
111
114
  version_requirements: !ruby/object:Gem::Requirement
112
115
  requirements:
113
116
  - - "~>"
114
117
  - !ruby/object:Gem::Version
115
- version: '5.0'
118
+ version: '3.3'
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: 3.3.7
116
122
  - !ruby/object:Gem::Dependency
117
- name: connection_pool
123
+ name: rspec
118
124
  requirement: !ruby/object:Gem::Requirement
119
125
  requirements:
120
126
  - - "~>"
121
127
  - !ruby/object:Gem::Version
122
- version: '2.3'
128
+ version: '3.10'
123
129
  type: :development
124
130
  prerelease: false
125
131
  version_requirements: !ruby/object:Gem::Requirement
126
132
  requirements:
127
133
  - - "~>"
128
134
  - !ruby/object:Gem::Version
129
- version: '2.3'
135
+ version: '3.10'
130
136
  - !ruby/object:Gem::Dependency
131
137
  name: rspec_junit_formatter
132
138
  requirement: !ruby/object:Gem::Requirement
@@ -142,89 +148,95 @@ dependencies:
142
148
  - !ruby/object:Gem::Version
143
149
  version: '0.4'
144
150
  - !ruby/object:Gem::Dependency
145
- name: timecop
151
+ name: rubocop
146
152
  requirement: !ruby/object:Gem::Requirement
147
153
  requirements:
148
154
  - - "~>"
149
155
  - !ruby/object:Gem::Version
150
- version: '0.9'
156
+ version: '1.76'
151
157
  type: :development
152
158
  prerelease: false
153
159
  version_requirements: !ruby/object:Gem::Requirement
154
160
  requirements:
155
161
  - - "~>"
156
162
  - !ruby/object:Gem::Version
157
- version: '0.9'
163
+ version: '1.76'
158
164
  - !ruby/object:Gem::Dependency
159
- name: listen
165
+ name: rubocop-performance
160
166
  requirement: !ruby/object:Gem::Requirement
161
167
  requirements:
162
168
  - - "~>"
163
169
  - !ruby/object:Gem::Version
164
- version: '3.3'
170
+ version: '1.25'
165
171
  type: :development
166
172
  prerelease: false
167
173
  version_requirements: !ruby/object:Gem::Requirement
168
174
  requirements:
169
175
  - - "~>"
170
176
  - !ruby/object:Gem::Version
171
- version: '3.3'
177
+ version: '1.25'
172
178
  - !ruby/object:Gem::Dependency
173
- name: webrick
179
+ name: simplecov
174
180
  requirement: !ruby/object:Gem::Requirement
175
181
  requirements:
176
182
  - - "~>"
177
183
  - !ruby/object:Gem::Version
178
- version: '1.7'
184
+ version: '0.21'
179
185
  type: :development
180
186
  prerelease: false
181
187
  version_requirements: !ruby/object:Gem::Requirement
182
188
  requirements:
183
189
  - - "~>"
184
190
  - !ruby/object:Gem::Version
185
- version: '1.7'
191
+ version: '0.21'
186
192
  - !ruby/object:Gem::Dependency
187
- name: rubocop
193
+ name: timecop
188
194
  requirement: !ruby/object:Gem::Requirement
189
195
  requirements:
190
196
  - - "~>"
191
197
  - !ruby/object:Gem::Version
192
- version: '1.37'
198
+ version: '0.9'
193
199
  type: :development
194
200
  prerelease: false
195
201
  version_requirements: !ruby/object:Gem::Requirement
196
202
  requirements:
197
203
  - - "~>"
198
204
  - !ruby/object:Gem::Version
199
- version: '1.37'
205
+ version: '0.9'
200
206
  - !ruby/object:Gem::Dependency
201
- name: rubocop-performance
207
+ name: webrick
202
208
  requirement: !ruby/object:Gem::Requirement
203
209
  requirements:
204
210
  - - "~>"
205
211
  - !ruby/object:Gem::Version
206
- version: '1.15'
212
+ version: '1.7'
207
213
  type: :development
208
214
  prerelease: false
209
215
  version_requirements: !ruby/object:Gem::Requirement
210
216
  requirements:
211
217
  - - "~>"
212
218
  - !ruby/object:Gem::Version
213
- version: '1.15'
219
+ version: '1.7'
214
220
  - !ruby/object:Gem::Dependency
215
- name: semantic
221
+ name: benchmark
216
222
  requirement: !ruby/object:Gem::Requirement
217
223
  requirements:
218
224
  - - "~>"
219
225
  - !ruby/object:Gem::Version
220
- version: '1.6'
226
+ version: '0.1'
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: 0.1.1
221
230
  type: :runtime
222
231
  prerelease: false
223
232
  version_requirements: !ruby/object:Gem::Requirement
224
233
  requirements:
225
234
  - - "~>"
226
235
  - !ruby/object:Gem::Version
227
- version: '1.6'
236
+ version: '0.1'
237
+ - - ">="
238
+ - !ruby/object:Gem::Version
239
+ version: 0.1.1
228
240
  - !ruby/object:Gem::Dependency
229
241
  name: concurrent-ruby
230
242
  requirement: !ruby/object:Gem::Requirement
@@ -268,19 +280,19 @@ dependencies:
268
280
  - !ruby/object:Gem::Version
269
281
  version: 0.1.2
270
282
  - !ruby/object:Gem::Dependency
271
- name: json
283
+ name: semantic
272
284
  requirement: !ruby/object:Gem::Requirement
273
285
  requirements:
274
286
  - - "~>"
275
287
  - !ruby/object:Gem::Version
276
- version: '2.3'
288
+ version: '1.6'
277
289
  type: :runtime
278
290
  prerelease: false
279
291
  version_requirements: !ruby/object:Gem::Requirement
280
292
  requirements:
281
293
  - - "~>"
282
294
  - !ruby/object:Gem::Version
283
- version: '2.3'
295
+ version: '1.6'
284
296
  - !ruby/object:Gem::Dependency
285
297
  name: http
286
298
  requirement: !ruby/object:Gem::Requirement
@@ -301,6 +313,20 @@ dependencies:
301
313
  - - "<"
302
314
  - !ruby/object:Gem::Version
303
315
  version: 6.0.0
316
+ - !ruby/object:Gem::Dependency
317
+ name: json
318
+ requirement: !ruby/object:Gem::Requirement
319
+ requirements:
320
+ - - "~>"
321
+ - !ruby/object:Gem::Version
322
+ version: '2.3'
323
+ type: :runtime
324
+ prerelease: false
325
+ version_requirements: !ruby/object:Gem::Requirement
326
+ requirements:
327
+ - - "~>"
328
+ - !ruby/object:Gem::Version
329
+ version: '2.3'
304
330
  description: Official LaunchDarkly SDK for Ruby
305
331
  email:
306
332
  - team@launchdarkly.com