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.
- checksums.yaml +4 -4
- data/.rubocop.yml +10 -3
- data/CHANGES.txt +3 -0
- data/lib/splitclient-rb/cache/fetchers/segment_fetcher.rb +17 -6
- data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +21 -11
- data/lib/splitclient-rb/cache/repositories/splits_repository.rb +1 -1
- data/lib/splitclient-rb/clients/split_client.rb +4 -7
- data/lib/splitclient-rb/constants.rb +10 -0
- data/lib/splitclient-rb/engine/api/splits.rb +0 -1
- data/lib/splitclient-rb/engine/auth_api_client.rb +78 -0
- data/lib/splitclient-rb/engine/push_manager.rb +53 -0
- data/lib/splitclient-rb/engine/sync_manager.rb +123 -0
- data/lib/splitclient-rb/engine/synchronizer.rb +90 -0
- data/lib/splitclient-rb/exceptions.rb +8 -0
- data/lib/splitclient-rb/helpers/thread_helper.rb +25 -0
- data/lib/splitclient-rb/split_config.rb +42 -4
- data/lib/splitclient-rb/split_factory.rb +25 -15
- data/lib/splitclient-rb/sse/event_source/back_off.rb +25 -0
- data/lib/splitclient-rb/sse/event_source/client.rb +85 -60
- data/lib/splitclient-rb/sse/event_source/stream_data.rb +22 -0
- data/lib/splitclient-rb/sse/notification_manager_keeper.rb +71 -0
- data/lib/splitclient-rb/sse/notification_processor.rb +50 -0
- data/lib/splitclient-rb/sse/sse_handler.rb +47 -52
- data/lib/splitclient-rb/sse/workers/segments_worker.rb +21 -6
- data/lib/splitclient-rb/sse/workers/splits_worker.rb +24 -6
- data/lib/splitclient-rb/version.rb +1 -1
- data/lib/splitclient-rb.rb +10 -3
- data/splitclient-rb.gemspec +1 -0
- metadata +28 -7
- data/lib/splitclient-rb/engine/parser/split_adapter.rb +0 -105
- data/lib/splitclient-rb/sse/event_source/status.rb +0 -13
- 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(
|
8
|
-
@
|
7
|
+
def initialize(synchronizer, config, segments_repository)
|
8
|
+
@synchronizer = synchronizer
|
9
9
|
@config = config
|
10
10
|
@segments_repository = segments_repository
|
11
|
-
@queue =
|
11
|
+
@queue = nil
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
+
def start
|
15
|
+
return if SplitIoClient::Helpers::ThreadHelper.alive?(:segment_update_worker, @config)
|
14
16
|
|
15
|
-
|
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
|
-
|
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(
|
8
|
-
@
|
7
|
+
def initialize(synchronizer, config, splits_repository)
|
8
|
+
@synchronizer = synchronizer
|
9
9
|
@config = config
|
10
10
|
@splits_repository = splits_repository
|
11
|
-
|
11
|
+
end
|
12
12
|
|
13
|
-
|
13
|
+
def start
|
14
|
+
return if SplitIoClient::Helpers::ThreadHelper.alive?(:split_update_worker, @config)
|
14
15
|
|
15
|
-
|
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
|
-
|
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
|
data/lib/splitclient-rb.rb
CHANGED
@@ -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/
|
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
|
data/splitclient-rb.gemspec
CHANGED
@@ -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
|
+
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-
|
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/
|
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/
|
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:
|
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,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
|