splitclient-rb 7.0.4.pre.rc3-java → 7.1.0-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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +10 -3
  3. data/CHANGES.txt +3 -0
  4. data/lib/splitclient-rb/cache/fetchers/segment_fetcher.rb +17 -6
  5. data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +21 -11
  6. data/lib/splitclient-rb/cache/repositories/splits_repository.rb +1 -1
  7. data/lib/splitclient-rb/clients/split_client.rb +4 -7
  8. data/lib/splitclient-rb/constants.rb +10 -0
  9. data/lib/splitclient-rb/engine/api/splits.rb +0 -1
  10. data/lib/splitclient-rb/engine/auth_api_client.rb +78 -0
  11. data/lib/splitclient-rb/engine/push_manager.rb +53 -0
  12. data/lib/splitclient-rb/engine/sync_manager.rb +123 -0
  13. data/lib/splitclient-rb/engine/synchronizer.rb +90 -0
  14. data/lib/splitclient-rb/exceptions.rb +8 -0
  15. data/lib/splitclient-rb/helpers/thread_helper.rb +25 -0
  16. data/lib/splitclient-rb/split_config.rb +42 -4
  17. data/lib/splitclient-rb/split_factory.rb +25 -15
  18. data/lib/splitclient-rb/sse/event_source/back_off.rb +25 -0
  19. data/lib/splitclient-rb/sse/event_source/client.rb +85 -60
  20. data/lib/splitclient-rb/sse/event_source/stream_data.rb +22 -0
  21. data/lib/splitclient-rb/sse/notification_manager_keeper.rb +71 -0
  22. data/lib/splitclient-rb/sse/notification_processor.rb +50 -0
  23. data/lib/splitclient-rb/sse/sse_handler.rb +47 -52
  24. data/lib/splitclient-rb/sse/workers/segments_worker.rb +21 -6
  25. data/lib/splitclient-rb/sse/workers/splits_worker.rb +24 -6
  26. data/lib/splitclient-rb/version.rb +1 -1
  27. data/lib/splitclient-rb.rb +10 -3
  28. data/splitclient-rb.gemspec +1 -0
  29. metadata +28 -7
  30. data/lib/splitclient-rb/engine/parser/split_adapter.rb +0 -105
  31. data/lib/splitclient-rb/sse/event_source/status.rb +0 -13
  32. data/lib/splitclient-rb/sse/workers/control_worker.rb +0 -34
@@ -4,22 +4,33 @@ module SplitIoClient
4
4
  module SSE
5
5
  module Workers
6
6
  class SegmentsWorker
7
- def initialize(adapter, config, segments_repository)
8
- @adapter = adapter
7
+ def initialize(synchronizer, config, segments_repository)
8
+ @synchronizer = synchronizer
9
9
  @config = config
10
10
  @segments_repository = segments_repository
11
- @queue = Queue.new
11
+ @queue = nil
12
+ end
12
13
 
13
- perform_thread
14
+ def start
15
+ return if SplitIoClient::Helpers::ThreadHelper.alive?(:segment_update_worker, @config)
14
16
 
15
- perform_passenger_forked if defined?(PhusionPassenger)
17
+ @queue = Queue.new
18
+ perform_thread
16
19
  end
17
20
 
18
21
  def add_to_queue(change_number, segment_name)
22
+ return if @queue.nil?
23
+
19
24
  item = { change_number: change_number, segment_name: segment_name }
25
+ @config.logger.debug("SegmentsWorker add to queue #{item}")
20
26
  @queue.push(item)
21
27
  end
22
28
 
29
+ def stop
30
+ SplitIoClient::Helpers::ThreadHelper.stop(:segment_update_worker, @config)
31
+ @queue = nil
32
+ end
33
+
23
34
  private
24
35
 
25
36
  def perform
@@ -28,12 +39,16 @@ module SplitIoClient
28
39
  change_number = item[:change_number]
29
40
  since = @segments_repository.get_change_number(segment_name)
30
41
 
31
- @adapter.segment_fetcher.fetch_segment(segment_name) unless since >= change_number
42
+ unless since >= change_number
43
+ @config.logger.debug("SegmentsWorker fetch_segment with #{since}")
44
+ @synchronizer.fetch_segment(segment_name)
45
+ end
32
46
  end
33
47
  end
34
48
 
35
49
  def perform_thread
36
50
  @config.threads[:segment_update_worker] = Thread.new do
51
+ @config.logger.debug('Starting segments worker ...') if @config.debug_enabled
37
52
  perform
38
53
  end
39
54
  end
@@ -4,37 +4,55 @@ module SplitIoClient
4
4
  module SSE
5
5
  module Workers
6
6
  class SplitsWorker
7
- def initialize(adapter, config, splits_repository)
8
- @adapter = adapter
7
+ def initialize(synchronizer, config, splits_repository)
8
+ @synchronizer = synchronizer
9
9
  @config = config
10
10
  @splits_repository = splits_repository
11
- @queue = Queue.new
11
+ end
12
12
 
13
- perform_thread
13
+ def start
14
+ return if SplitIoClient::Helpers::ThreadHelper.alive?(:split_update_worker, @config)
14
15
 
15
- perform_passenger_forked if defined?(PhusionPassenger)
16
+ @queue = Queue.new
17
+ perform_thread
16
18
  end
17
19
 
18
20
  def add_to_queue(change_number)
21
+ return if @queue.nil?
22
+
23
+ @config.logger.debug("SplitsWorker add to queue #{change_number}")
19
24
  @queue.push(change_number)
20
25
  end
21
26
 
22
27
  def kill_split(change_number, split_name, default_treatment)
28
+ return if @queue.nil?
29
+
30
+ @config.logger.debug("SplitsWorker kill #{split_name}, #{change_number}")
23
31
  @splits_repository.kill(change_number, split_name, default_treatment)
24
32
  add_to_queue(change_number)
25
33
  end
26
34
 
35
+ def stop
36
+ SplitIoClient::Helpers::ThreadHelper.stop(:split_update_worker, @config)
37
+ @queue = nil
38
+ end
39
+
27
40
  private
28
41
 
29
42
  def perform
30
43
  while (change_number = @queue.pop)
31
44
  since = @splits_repository.get_change_number
32
- @adapter.split_fetcher.fetch_splits unless since >= change_number
45
+
46
+ unless since.to_i >= change_number
47
+ @config.logger.debug("SplitsWorker fetch_splits with #{since}")
48
+ @synchronizer.fetch_splits
49
+ end
33
50
  end
34
51
  end
35
52
 
36
53
  def perform_thread
37
54
  @config.threads[:split_update_worker] = Thread.new do
55
+ @config.logger.debug('Starting splits worker ...') if @config.debug_enabled
38
56
  perform
39
57
  end
40
58
  end
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '7.0.4.pre.rc3'
2
+ VERSION = '7.1.0'
3
3
  end
@@ -2,6 +2,7 @@ require 'forwardable'
2
2
 
3
3
  require 'splitclient-rb/version'
4
4
 
5
+ require 'splitclient-rb/constants'
5
6
  require 'splitclient-rb/exceptions'
6
7
  require 'splitclient-rb/cache/routers/impression_router'
7
8
  require 'splitclient-rb/cache/adapters/memory_adapters/map_adapter'
@@ -35,6 +36,7 @@ require 'splitclient-rb/cache/stores/localhost_split_store'
35
36
 
36
37
  require 'splitclient-rb/clients/split_client'
37
38
  require 'splitclient-rb/managers/split_manager'
39
+ require 'splitclient-rb/helpers/thread_helper'
38
40
  require 'splitclient-rb/split_factory'
39
41
  require 'splitclient-rb/split_factory_builder'
40
42
  require 'splitclient-rb/split_config'
@@ -52,7 +54,6 @@ require 'splitclient-rb/engine/api/splits'
52
54
  require 'splitclient-rb/engine/api/events'
53
55
  require 'splitclient-rb/engine/parser/condition'
54
56
  require 'splitclient-rb/engine/parser/partition'
55
- require 'splitclient-rb/engine/parser/split_adapter'
56
57
  require 'splitclient-rb/engine/parser/evaluator'
57
58
  require 'splitclient-rb/engine/matchers/matcher'
58
59
  require 'splitclient-rb/engine/matchers/combiners'
@@ -83,18 +84,24 @@ require 'splitclient-rb/engine/metrics/binary_search_latency_tracker'
83
84
  require 'splitclient-rb/engine/models/split'
84
85
  require 'splitclient-rb/engine/models/label'
85
86
  require 'splitclient-rb/engine/models/treatment'
87
+ require 'splitclient-rb/engine/auth_api_client'
88
+ require 'splitclient-rb/engine/push_manager'
89
+ require 'splitclient-rb/engine/sync_manager'
90
+ require 'splitclient-rb/engine/synchronizer'
86
91
  require 'splitclient-rb/utilitites'
87
92
 
88
93
  # redis metrics fixer
89
94
  require 'splitclient-rb/redis_metrics_fixer'
90
95
 
91
96
  # SSE
97
+ require 'splitclient-rb/sse/event_source/back_off'
92
98
  require 'splitclient-rb/sse/event_source/client'
93
99
  require 'splitclient-rb/sse/event_source/event_types'
94
- require 'splitclient-rb/sse/event_source/status'
95
- require 'splitclient-rb/sse/workers/control_worker'
100
+ require 'splitclient-rb/sse/event_source/stream_data'
96
101
  require 'splitclient-rb/sse/workers/segments_worker'
97
102
  require 'splitclient-rb/sse/workers/splits_worker'
103
+ require 'splitclient-rb/sse/notification_manager_keeper'
104
+ require 'splitclient-rb/sse/notification_processor'
98
105
  require 'splitclient-rb/sse/sse_handler'
99
106
 
100
107
  # C extension
@@ -51,6 +51,7 @@ Gem::Specification.new do |spec|
51
51
  spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
52
52
  spec.add_runtime_dependency 'faraday', '>= 0.8'
53
53
  spec.add_runtime_dependency 'json', '>= 1.8'
54
+ spec.add_runtime_dependency 'jwt', '>= 2.2.1'
54
55
  spec.add_runtime_dependency 'lru_redux'
55
56
  spec.add_runtime_dependency 'net-http-persistent', '>= 2.9'
56
57
  spec.add_runtime_dependency 'redis', '>= 3.2'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: splitclient-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.4.pre.rc3
4
+ version: 7.1.0
5
5
  platform: java
6
6
  authors:
7
7
  - Split Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-02 00:00:00.000000000 Z
11
+ date: 2020-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -220,6 +220,20 @@ dependencies:
220
220
  - - ">="
221
221
  - !ruby/object:Gem::Version
222
222
  version: '1.8'
223
+ - !ruby/object:Gem::Dependency
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - ">="
227
+ - !ruby/object:Gem::Version
228
+ version: 2.2.1
229
+ name: jwt
230
+ prerelease: false
231
+ type: :runtime
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: 2.2.1
223
237
  - !ruby/object:Gem::Dependency
224
238
  requirement: !ruby/object:Gem::Requirement
225
239
  requirements:
@@ -346,6 +360,7 @@ files:
346
360
  - lib/splitclient-rb/cache/stores/sdk_blocker.rb
347
361
  - lib/splitclient-rb/cache/stores/store_utils.rb
348
362
  - lib/splitclient-rb/clients/split_client.rb
363
+ - lib/splitclient-rb/constants.rb
349
364
  - lib/splitclient-rb/engine/api/client.rb
350
365
  - lib/splitclient-rb/engine/api/events.rb
351
366
  - lib/splitclient-rb/engine/api/faraday_adapter/patched_net_http_persistent.rb
@@ -354,6 +369,7 @@ files:
354
369
  - lib/splitclient-rb/engine/api/metrics.rb
355
370
  - lib/splitclient-rb/engine/api/segments.rb
356
371
  - lib/splitclient-rb/engine/api/splits.rb
372
+ - lib/splitclient-rb/engine/auth_api_client.rb
357
373
  - lib/splitclient-rb/engine/evaluator/splitter.rb
358
374
  - lib/splitclient-rb/engine/matchers/all_keys_matcher.rb
359
375
  - lib/splitclient-rb/engine/matchers/between_matcher.rb
@@ -385,8 +401,11 @@ files:
385
401
  - lib/splitclient-rb/engine/parser/condition.rb
386
402
  - lib/splitclient-rb/engine/parser/evaluator.rb
387
403
  - lib/splitclient-rb/engine/parser/partition.rb
388
- - lib/splitclient-rb/engine/parser/split_adapter.rb
404
+ - lib/splitclient-rb/engine/push_manager.rb
405
+ - lib/splitclient-rb/engine/sync_manager.rb
406
+ - lib/splitclient-rb/engine/synchronizer.rb
389
407
  - lib/splitclient-rb/exceptions.rb
408
+ - lib/splitclient-rb/helpers/thread_helper.rb
390
409
  - lib/splitclient-rb/managers/split_manager.rb
391
410
  - lib/splitclient-rb/redis_metrics_fixer.rb
392
411
  - lib/splitclient-rb/split_config.rb
@@ -394,11 +413,13 @@ files:
394
413
  - lib/splitclient-rb/split_factory_builder.rb
395
414
  - lib/splitclient-rb/split_factory_registry.rb
396
415
  - lib/splitclient-rb/split_logger.rb
416
+ - lib/splitclient-rb/sse/event_source/back_off.rb
397
417
  - lib/splitclient-rb/sse/event_source/client.rb
398
418
  - lib/splitclient-rb/sse/event_source/event_types.rb
399
- - lib/splitclient-rb/sse/event_source/status.rb
419
+ - lib/splitclient-rb/sse/event_source/stream_data.rb
420
+ - lib/splitclient-rb/sse/notification_manager_keeper.rb
421
+ - lib/splitclient-rb/sse/notification_processor.rb
400
422
  - lib/splitclient-rb/sse/sse_handler.rb
401
- - lib/splitclient-rb/sse/workers/control_worker.rb
402
423
  - lib/splitclient-rb/sse/workers/segments_worker.rb
403
424
  - lib/splitclient-rb/sse/workers/splits_worker.rb
404
425
  - lib/splitclient-rb/utilitites.rb
@@ -423,9 +444,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
423
444
  version: '0'
424
445
  required_rubygems_version: !ruby/object:Gem::Requirement
425
446
  requirements:
426
- - - ">"
447
+ - - ">="
427
448
  - !ruby/object:Gem::Version
428
- version: 1.3.1
449
+ version: '0'
429
450
  requirements: []
430
451
  rubyforge_project:
431
452
  rubygems_version: 2.6.14
@@ -1,105 +0,0 @@
1
- require 'json'
2
- require 'thread'
3
-
4
- include SplitIoClient::Cache::Fetchers
5
- include SplitIoClient::Cache::Stores
6
- include SplitIoClient::Cache::Senders
7
-
8
- module SplitIoClient
9
- #
10
- # acts as an api adapater to connect to split endpoints
11
- # uses a configuration object that can be modified when creating the client instance
12
- # also, uses safe threads to execute fetches and post give the time execution values from the config
13
- #
14
- class SplitAdapter < NoMethodError
15
- attr_reader :splits_repository, :segments_repository, :impressions_repository, :metrics, :split_fetcher, :segment_fetcher
16
-
17
- #
18
- # Creates a new split api adapter instance that consumes split api endpoints
19
- #
20
- # @param api_key [String] the API key for your split account
21
- # @param splits_repository [SplitsRepository] SplitsRepository instance to store splits in
22
- # @param segments_repository [SegmentsRepository] SegmentsRepository instance to store segments in
23
- # @param impressions_repository [ImpressionsRepository] ImpressionsRepository instance to store impressions in
24
- # @param metrics_repository [MetricsRepository] MetricsRepository instance to store metrics in
25
- # @param sdk_blocker [SDKBlocker] SDKBlocker instance which blocks splits_repository/segments_repository
26
- #
27
- # @return [SplitIoClient] split.io client instance
28
- def initialize(
29
- api_key,
30
- splits_repository,
31
- segments_repository,
32
- impressions_repository,
33
- metrics_repository,
34
- events_repository,
35
- sdk_blocker,
36
- config
37
- )
38
- @api_key = api_key
39
- @splits_repository = splits_repository
40
- @segments_repository = segments_repository
41
- @impressions_repository = impressions_repository
42
- @metrics_repository = metrics_repository
43
- @events_repository = events_repository
44
- @metrics = Metrics.new(100, @metrics_repository)
45
- @sdk_blocker = sdk_blocker
46
- @config = config
47
-
48
- start_localhost_components if @config.localhost_mode
49
-
50
- start_standalone_components if @config.standalone? && !@config.localhost_mode
51
- end
52
-
53
- def start_standalone_components
54
- split_fetch
55
- segment_fetch
56
- metrics_sender
57
- impressions_sender
58
- events_sender
59
- end
60
-
61
- def start_localhost_components
62
- localhost_split_store
63
- localhost_repo_cleaner
64
- end
65
-
66
- # Starts thread which loops constantly and retrieves splits from a file source
67
- def localhost_split_store
68
- LocalhostSplitStore.new(@splits_repository, @config, @sdk_blocker).call
69
- end
70
-
71
- # Starts thread which loops constantly and cleans up repositories to avoid memory issues in localhost mode
72
- def localhost_repo_cleaner
73
- LocalhostRepoCleaner.new(@impressions_repository, @metrics_repository, @events_repository, @config).call
74
- end
75
-
76
- # Starts thread which loops constantly and stores splits in the splits_repository of choice
77
- def split_fetch
78
- @split_fetcher = SplitFetcher.new(@splits_repository, @api_key, @metrics, @config, @sdk_blocker)
79
- @split_fetcher.fetch_splits if @config.push_notification_enabled
80
- @split_fetcher.call unless @config.push_notification_enabled
81
- end
82
-
83
- # Starts thread which loops constantly and stores segments in the segments_repository of choice
84
- def segment_fetch
85
- @segment_fetcher = SegmentFetcher.new(@segments_repository, @api_key, @metrics, @config, @sdk_blocker)
86
- @segment_fetcher.fetch_segments if @config.push_notification_enabled
87
- @segment_fetcher.call unless @config.push_notification_enabled
88
- end
89
-
90
- # Starts thread which loops constantly and sends impressions to the Split API
91
- def impressions_sender
92
- ImpressionsSender.new(@impressions_repository, @api_key, @config).call
93
- end
94
-
95
- # Starts thread which loops constantly and sends metrics to the Split API
96
- def metrics_sender
97
- MetricsSender.new(@metrics_repository, @api_key, @config).call
98
- end
99
-
100
- # Starts thread which loops constantly and sends events to the Split API
101
- def events_sender
102
- EventsSender.new(@events_repository, @config).call
103
- end
104
- end
105
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SplitIoClient
4
- module SSE
5
- module EventSource
6
- class Status
7
- CONNECTING = 'Connecting'
8
- CONNECTED = 'Connected'
9
- DISCONNECTED = 'Disconnected'
10
- end
11
- end
12
- end
13
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SplitIoClient
4
- module SSE
5
- module Workers
6
- class ControlWorker
7
- def initialize(adapter, config)
8
- @adapter = adapter
9
- @config = config
10
-
11
- perform_thread
12
-
13
- perform_passenger_forked if defined?(PhusionPassenger)
14
- end
15
-
16
- private
17
-
18
- def perform
19
- # TODO: IMPLEMENT THIS METHOD
20
- end
21
-
22
- def perform_thread
23
- @config.threads[:segment_update_worker] = Thread.new do
24
- perform
25
- end
26
- end
27
-
28
- def perform_passenger_forked
29
- PhusionPassenger.on_event(:starting_worker_process) { |forked| perform_thread if forked }
30
- end
31
- end
32
- end
33
- end
34
- end