splitclient-rb 7.0.4.pre.rc3-java → 7.1.0-java

Sign up to get free protection for your applications and to get access to all the features.
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