splitclient-rb 7.2.0.pre.rc1 → 7.2.0
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/lib/splitclient-rb.rb +0 -1
- data/lib/splitclient-rb/cache/adapters/redis_adapter.rb +1 -1
- data/lib/splitclient-rb/engine/push_manager.rb +5 -7
- data/lib/splitclient-rb/engine/sync_manager.rb +13 -33
- data/lib/splitclient-rb/engine/synchronizer.rb +3 -5
- data/lib/splitclient-rb/split_factory.rb +10 -14
- data/lib/splitclient-rb/sse/event_source/client.rb +65 -42
- data/lib/splitclient-rb/sse/sse_handler.rb +3 -3
- data/lib/splitclient-rb/sse/workers/segments_worker.rb +9 -21
- data/lib/splitclient-rb/sse/workers/splits_worker.rb +9 -27
- data/lib/splitclient-rb/version.rb +1 -1
- data/splitclient-rb.gemspec +1 -1
- metadata +6 -7
- data/lib/splitclient-rb/sse/event_source/event_parser.rb +0 -55
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5a8bad0b7b72fba188bff72b10b5a0849bdadabdde484929b83071a51cfe715
|
4
|
+
data.tar.gz: 27b74c33b6fbe6c87141bf163f1dbd8d37eaa586d8c60eb73319cbcb7e3cc85e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0db37fb36974d3b177b3b4b08d35199bf828b8c4ebc508731e1255c44c08f9be2953174e6dbb3b1a2d514f880845b0abefd300061ad9b77e72745a867b930dc4
|
7
|
+
data.tar.gz: 0d66fc9a82f117ed7ccc4e391aa59827ed024d34d3082472dab54d6c3cacd57357c01af6eb6becb69f8a0dabc12cc51258e0e7a852fbfc9c82d414eb1ad1d40b
|
data/lib/splitclient-rb.rb
CHANGED
@@ -101,7 +101,6 @@ require 'splitclient-rb/redis_metrics_fixer'
|
|
101
101
|
# SSE
|
102
102
|
require 'splitclient-rb/sse/event_source/back_off'
|
103
103
|
require 'splitclient-rb/sse/event_source/client'
|
104
|
-
require 'splitclient-rb/sse/event_source/event_parser'
|
105
104
|
require 'splitclient-rb/sse/event_source/event_types'
|
106
105
|
require 'splitclient-rb/sse/event_source/stream_data'
|
107
106
|
require 'splitclient-rb/sse/workers/segments_worker'
|
@@ -15,15 +15,14 @@ module SplitIoClient
|
|
15
15
|
response = @auth_api_client.authenticate(@api_key)
|
16
16
|
|
17
17
|
@config.logger.debug("Auth service response push_enabled: #{response[:push_enabled]}") if @config.debug_enabled
|
18
|
-
|
19
|
-
|
18
|
+
if response[:push_enabled]
|
19
|
+
@sse_handler.start(response[:token], response[:channels])
|
20
20
|
schedule_next_token_refresh(response[:exp])
|
21
21
|
@back_off.reset
|
22
|
-
|
22
|
+
else
|
23
|
+
stop_sse
|
23
24
|
end
|
24
25
|
|
25
|
-
stop_sse
|
26
|
-
|
27
26
|
schedule_next_token_refresh(@back_off.interval) if response[:retry]
|
28
27
|
rescue StandardError => e
|
29
28
|
@config.logger.error("start_sse: #{e.inspect}")
|
@@ -32,7 +31,6 @@ module SplitIoClient
|
|
32
31
|
def stop_sse
|
33
32
|
@sse_handler.process_disconnect if @sse_handler.sse_client.nil?
|
34
33
|
@sse_handler.stop
|
35
|
-
SplitIoClient::Helpers::ThreadHelper.stop(:schedule_next_token_refresh, @config)
|
36
34
|
end
|
37
35
|
|
38
36
|
private
|
@@ -43,7 +41,7 @@ module SplitIoClient
|
|
43
41
|
@config.logger.debug("schedule_next_token_refresh refresh in #{time} seconds.") if @config.debug_enabled
|
44
42
|
sleep(time)
|
45
43
|
@config.logger.debug('schedule_next_token_refresh starting ...') if @config.debug_enabled
|
46
|
-
|
44
|
+
stop_sse
|
47
45
|
start_sse
|
48
46
|
rescue StandardError => e
|
49
47
|
@config.logger.debug("schedule_next_token_refresh error: #{e.inspect}") if @config.debug_enabled
|
@@ -3,13 +3,19 @@
|
|
3
3
|
module SplitIoClient
|
4
4
|
module Engine
|
5
5
|
class SyncManager
|
6
|
+
include SplitIoClient::Cache::Fetchers
|
7
|
+
|
6
8
|
def initialize(
|
7
9
|
repositories,
|
8
10
|
api_key,
|
9
11
|
config,
|
10
|
-
|
12
|
+
params
|
11
13
|
)
|
12
|
-
|
14
|
+
split_fetcher = SplitFetcher.new(repositories[:splits], api_key, params[:metrics], config, params[:sdk_blocker])
|
15
|
+
segment_fetcher = SegmentFetcher.new(repositories[:segments], api_key, params[:metrics], config, params[:sdk_blocker])
|
16
|
+
sync_params = { split_fetcher: split_fetcher, segment_fetcher: segment_fetcher, imp_counter: params[:impression_counter] }
|
17
|
+
|
18
|
+
@synchronizer = Synchronizer.new(repositories, api_key, config, params[:sdk_blocker], sync_params)
|
13
19
|
notification_manager_keeper = SplitIoClient::SSE::NotificationManagerKeeper.new(config) do |manager|
|
14
20
|
manager.on_occupancy { |publisher_available| process_occupancy(publisher_available) }
|
15
21
|
manager.on_push_shutdown { process_push_shutdown }
|
@@ -22,11 +28,10 @@ module SplitIoClient
|
|
22
28
|
notification_manager_keeper
|
23
29
|
) do |handler|
|
24
30
|
handler.on_connected { process_connected }
|
25
|
-
handler.on_disconnect {
|
31
|
+
handler.on_disconnect { process_disconnect }
|
26
32
|
end
|
27
33
|
|
28
34
|
@push_manager = PushManager.new(config, @sse_handler, api_key)
|
29
|
-
@sse_connected = Concurrent::AtomicBoolean.new(false)
|
30
35
|
@config = config
|
31
36
|
end
|
32
37
|
|
@@ -85,12 +90,6 @@ module SplitIoClient
|
|
85
90
|
end
|
86
91
|
|
87
92
|
def process_connected
|
88
|
-
if @sse_connected.value
|
89
|
-
@config.logger.debug('Streaming already connected.')
|
90
|
-
return
|
91
|
-
end
|
92
|
-
|
93
|
-
@sse_connected.make_true
|
94
93
|
@synchronizer.stop_periodic_fetch
|
95
94
|
@synchronizer.sync_all
|
96
95
|
@sse_handler.start_workers
|
@@ -98,42 +97,23 @@ module SplitIoClient
|
|
98
97
|
@config.logger.error("process_connected error: #{e.inspect}")
|
99
98
|
end
|
100
99
|
|
101
|
-
def process_disconnect
|
102
|
-
unless @sse_connected.value
|
103
|
-
@config.logger.debug('Streaming already disconnected.')
|
104
|
-
return
|
105
|
-
end
|
106
|
-
|
107
|
-
@sse_connected.make_false
|
100
|
+
def process_disconnect
|
108
101
|
@sse_handler.stop_workers
|
109
102
|
@synchronizer.start_periodic_fetch
|
110
|
-
|
111
|
-
if reconnect
|
112
|
-
@synchronizer.sync_all
|
113
|
-
@push_manager.start_sse
|
114
|
-
end
|
115
103
|
rescue StandardError => e
|
116
104
|
@config.logger.error("process_disconnect error: #{e.inspect}")
|
117
105
|
end
|
118
106
|
|
119
107
|
def process_occupancy(push_enable)
|
120
|
-
|
121
|
-
|
122
|
-
@synchronizer.sync_all
|
123
|
-
@sse_handler.start_workers
|
124
|
-
return
|
125
|
-
end
|
126
|
-
|
127
|
-
@sse_handler.stop_workers
|
128
|
-
@synchronizer.start_periodic_fetch
|
108
|
+
process_disconnect unless push_enable
|
109
|
+
process_connected if push_enable
|
129
110
|
rescue StandardError => e
|
130
111
|
@config.logger.error("process_occupancy error: #{e.inspect}")
|
131
112
|
end
|
132
113
|
|
133
114
|
def process_push_shutdown
|
134
115
|
@push_manager.stop_sse
|
135
|
-
|
136
|
-
@synchronizer.start_periodic_fetch
|
116
|
+
process_disconnect
|
137
117
|
rescue StandardError => e
|
138
118
|
@config.logger.error("process_push_shutdown error: #{e.inspect}")
|
139
119
|
end
|
@@ -28,11 +28,9 @@ module SplitIoClient
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def sync_all
|
31
|
-
@config.
|
32
|
-
|
33
|
-
|
34
|
-
fetch_segments
|
35
|
-
end
|
31
|
+
@config.logger.debug('Synchronizing Splits and Segments ...') if @config.debug_enabled
|
32
|
+
fetch_splits
|
33
|
+
fetch_segments
|
36
34
|
end
|
37
35
|
|
38
36
|
def start_periodic_data_recording
|
@@ -7,7 +7,6 @@ module SplitIoClient
|
|
7
7
|
include SplitIoClient::Cache::Repositories
|
8
8
|
include SplitIoClient::Cache::Stores
|
9
9
|
include SplitIoClient::Cache::Senders
|
10
|
-
include SplitIoClient::Cache::Fetchers
|
11
10
|
|
12
11
|
attr_reader :adapter, :client, :manager, :config
|
13
12
|
|
@@ -54,12 +53,8 @@ module SplitIoClient
|
|
54
53
|
if @config.localhost_mode
|
55
54
|
start_localhost_components
|
56
55
|
else
|
57
|
-
|
58
|
-
|
59
|
-
params = { split_fetcher: split_fetcher, segment_fetcher: segment_fetcher, imp_counter: @impression_counter }
|
60
|
-
|
61
|
-
synchronizer = SplitIoClient::Engine::Synchronizer.new(repositories, @api_key, @config, @sdk_blocker, params)
|
62
|
-
SplitIoClient::Engine::SyncManager.new(repositories, @api_key, @config, synchronizer).start
|
56
|
+
params = { sdk_blocker: @sdk_blocker, metrics: @metrics, impression_counter: @impression_counter }
|
57
|
+
SplitIoClient::Engine::SyncManager.new(repositories, @api_key, @config, params).start
|
63
58
|
end
|
64
59
|
end
|
65
60
|
|
@@ -130,13 +125,14 @@ module SplitIoClient
|
|
130
125
|
end
|
131
126
|
|
132
127
|
def repositories
|
133
|
-
{
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
128
|
+
repos = {}
|
129
|
+
repos[:splits] = @splits_repository
|
130
|
+
repos[:segments] = @segments_repository
|
131
|
+
repos[:impressions] = @impressions_repository
|
132
|
+
repos[:events] = @events_repository
|
133
|
+
repos[:metrics] = @metrics_repository
|
134
|
+
|
135
|
+
repos
|
140
136
|
end
|
141
137
|
|
142
138
|
def start_localhost_components
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: false
|
2
2
|
|
3
|
+
require 'concurrent/atomics'
|
3
4
|
require 'socketry'
|
4
5
|
require 'uri'
|
5
6
|
|
@@ -8,16 +9,15 @@ module SplitIoClient
|
|
8
9
|
module EventSource
|
9
10
|
class Client
|
10
11
|
DEFAULT_READ_TIMEOUT = 70
|
11
|
-
CONNECT_TIMEOUT = 30_000
|
12
12
|
KEEP_ALIVE_RESPONSE = "c\r\n:keepalive\n\n\r\n".freeze
|
13
|
-
ERROR_EVENT_TYPE = 'error'.freeze
|
14
13
|
|
15
14
|
def initialize(config, read_timeout: DEFAULT_READ_TIMEOUT)
|
16
15
|
@config = config
|
17
16
|
@read_timeout = read_timeout
|
18
17
|
@connected = Concurrent::AtomicBoolean.new(false)
|
19
18
|
@socket = nil
|
20
|
-
@
|
19
|
+
@back_off = BackOff.new(@config.streaming_reconnect_back_off_base)
|
20
|
+
|
21
21
|
@on = { event: ->(_) {}, connected: ->(_) {}, disconnect: ->(_) {} }
|
22
22
|
|
23
23
|
yield self if block_given?
|
@@ -35,8 +35,8 @@ module SplitIoClient
|
|
35
35
|
@on[:disconnect] = action
|
36
36
|
end
|
37
37
|
|
38
|
-
def close
|
39
|
-
dispatch_disconnect
|
38
|
+
def close
|
39
|
+
dispatch_disconnect
|
40
40
|
@connected.make_false
|
41
41
|
SplitIoClient::Helpers::ThreadHelper.stop(:connect_stream, @config)
|
42
42
|
@socket&.close
|
@@ -46,16 +46,10 @@ module SplitIoClient
|
|
46
46
|
|
47
47
|
def start(url)
|
48
48
|
@uri = URI(url)
|
49
|
-
latch = Concurrent::CountDownLatch.new(1)
|
50
|
-
|
51
|
-
connect_thread(latch)
|
52
49
|
|
53
|
-
|
54
|
-
|
55
|
-
connected?
|
50
|
+
connect_thread
|
56
51
|
rescue StandardError => e
|
57
52
|
@config.logger.error("SSEClient start Error: #{e.inspect}")
|
58
|
-
connected?
|
59
53
|
end
|
60
54
|
|
61
55
|
def connected?
|
@@ -64,15 +58,18 @@ module SplitIoClient
|
|
64
58
|
|
65
59
|
private
|
66
60
|
|
67
|
-
def connect_thread
|
61
|
+
def connect_thread
|
68
62
|
@config.threads[:connect_stream] = Thread.new do
|
69
63
|
@config.logger.info('Starting connect_stream thread ...') if @config.debug_enabled
|
70
|
-
connect_stream
|
64
|
+
connect_stream
|
71
65
|
end
|
72
66
|
end
|
73
67
|
|
74
|
-
def connect_stream
|
75
|
-
|
68
|
+
def connect_stream
|
69
|
+
interval = @back_off.interval
|
70
|
+
sleep(interval) if interval.positive?
|
71
|
+
|
72
|
+
socket_write
|
76
73
|
|
77
74
|
while @connected.value
|
78
75
|
begin
|
@@ -80,24 +77,24 @@ module SplitIoClient
|
|
80
77
|
|
81
78
|
raise 'eof exception' if partial_data == :eof
|
82
79
|
rescue StandardError => e
|
83
|
-
@config.logger.error(
|
84
|
-
|
85
|
-
|
80
|
+
@config.logger.error(e.inspect) if @config.debug_enabled
|
81
|
+
@connected.make_false
|
82
|
+
@socket&.close
|
83
|
+
@socket = nil
|
84
|
+
connect_stream
|
86
85
|
end
|
87
86
|
|
88
87
|
process_data(partial_data)
|
89
88
|
end
|
90
89
|
end
|
91
90
|
|
92
|
-
def socket_write
|
91
|
+
def socket_write
|
93
92
|
@socket = socket_connect
|
94
93
|
@socket.write(build_request(@uri))
|
95
94
|
dispatch_connected
|
96
95
|
rescue StandardError => e
|
97
96
|
@config.logger.error("Error during connecting to #{@uri.host}. Error: #{e.inspect}")
|
98
97
|
close
|
99
|
-
ensure
|
100
|
-
latch.count_down
|
101
98
|
end
|
102
99
|
|
103
100
|
def socket_connect
|
@@ -107,11 +104,11 @@ module SplitIoClient
|
|
107
104
|
end
|
108
105
|
|
109
106
|
def process_data(partial_data)
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
107
|
+
unless partial_data.nil? || partial_data == KEEP_ALIVE_RESPONSE
|
108
|
+
@config.logger.debug("Event partial data: #{partial_data}") if @config.debug_enabled
|
109
|
+
buffer = read_partial_data(partial_data)
|
110
|
+
parse_event(buffer)
|
111
|
+
end
|
115
112
|
rescue StandardError => e
|
116
113
|
@config.logger.error("process_data error: #{e.inspect}")
|
117
114
|
end
|
@@ -125,38 +122,64 @@ module SplitIoClient
|
|
125
122
|
req
|
126
123
|
end
|
127
124
|
|
128
|
-
def
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
dispatch_event(event)
|
134
|
-
end
|
125
|
+
def read_partial_data(data)
|
126
|
+
buffer = ''
|
127
|
+
buffer << data
|
128
|
+
buffer.chomp!
|
129
|
+
buffer.split("\n")
|
135
130
|
end
|
136
131
|
|
137
|
-
def
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
132
|
+
def parse_event(buffer)
|
133
|
+
type = nil
|
134
|
+
|
135
|
+
buffer.each do |d|
|
136
|
+
splited_data = d.split(':')
|
137
|
+
|
138
|
+
case splited_data[0]
|
139
|
+
when 'event'
|
140
|
+
type = splited_data[1].strip
|
141
|
+
when 'data'
|
142
|
+
data = parse_event_data(d, type)
|
143
|
+
unless type.nil? || data[:data].nil?
|
144
|
+
event = StreamData.new(type, data[:client_id], data[:data], data[:channel])
|
145
|
+
dispatch_event(event)
|
146
|
+
end
|
147
|
+
end
|
143
148
|
end
|
149
|
+
rescue StandardError => e
|
150
|
+
@config.logger.error("Error during parsing a event: #{e.inspect}")
|
151
|
+
end
|
152
|
+
|
153
|
+
def parse_event_data(data, type)
|
154
|
+
event_data = JSON.parse(data.sub('data: ', ''))
|
155
|
+
client_id = event_data['clientId']&.strip
|
156
|
+
channel = event_data['channel']&.strip
|
157
|
+
parsed_data = JSON.parse(event_data['data']) unless type == 'error'
|
158
|
+
parsed_data = event_data if type == 'error'
|
159
|
+
|
160
|
+
{ client_id: client_id, channel: channel, data: parsed_data }
|
144
161
|
end
|
145
162
|
|
146
163
|
def dispatch_event(event)
|
164
|
+
raise SSEClientException.new(event), 'Error event' if event.event_type == 'error'
|
165
|
+
|
147
166
|
@config.logger.debug("Dispatching event: #{event.event_type}, #{event.channel}") if @config.debug_enabled
|
148
167
|
@on[:event].call(event)
|
168
|
+
rescue SSEClientException => e
|
169
|
+
@config.logger.error("Event error: #{e.event.event_type}, #{e.event.data}")
|
170
|
+
close
|
149
171
|
end
|
150
172
|
|
151
173
|
def dispatch_connected
|
152
174
|
@connected.make_true
|
175
|
+
@back_off.reset
|
153
176
|
@config.logger.debug('Dispatching connected') if @config.debug_enabled
|
154
177
|
@on[:connected].call
|
155
178
|
end
|
156
179
|
|
157
|
-
def dispatch_disconnect
|
180
|
+
def dispatch_disconnect
|
158
181
|
@config.logger.debug('Dispatching disconnect') if @config.debug_enabled
|
159
|
-
@on[:disconnect].call
|
182
|
+
@on[:disconnect].call
|
160
183
|
end
|
161
184
|
end
|
162
185
|
end
|
@@ -14,7 +14,7 @@ module SplitIoClient
|
|
14
14
|
@sse_client = SSE::EventSource::Client.new(@config) do |client|
|
15
15
|
client.on_event { |event| handle_incoming_message(event) }
|
16
16
|
client.on_connected { process_connected }
|
17
|
-
client.on_disconnect {
|
17
|
+
client.on_disconnect { process_disconnect }
|
18
18
|
end
|
19
19
|
|
20
20
|
@on = { connected: ->(_) {}, disconnect: ->(_) {} }
|
@@ -56,8 +56,8 @@ module SplitIoClient
|
|
56
56
|
@on[:disconnect] = action
|
57
57
|
end
|
58
58
|
|
59
|
-
def process_disconnect
|
60
|
-
@on[:disconnect].call
|
59
|
+
def process_disconnect
|
60
|
+
@on[:disconnect].call
|
61
61
|
end
|
62
62
|
|
63
63
|
private
|
@@ -8,39 +8,27 @@ module SplitIoClient
|
|
8
8
|
@synchronizer = synchronizer
|
9
9
|
@config = config
|
10
10
|
@segments_repository = segments_repository
|
11
|
+
@queue = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def start
|
15
|
+
return if SplitIoClient::Helpers::ThreadHelper.alive?(:segment_update_worker, @config)
|
16
|
+
|
11
17
|
@queue = Queue.new
|
12
|
-
|
18
|
+
perform_thread
|
13
19
|
end
|
14
20
|
|
15
21
|
def add_to_queue(change_number, segment_name)
|
16
|
-
|
17
|
-
@config.logger.debug('segments worker not running.')
|
18
|
-
return
|
19
|
-
end
|
22
|
+
return if @queue.nil?
|
20
23
|
|
21
24
|
item = { change_number: change_number, segment_name: segment_name }
|
22
25
|
@config.logger.debug("SegmentsWorker add to queue #{item}")
|
23
26
|
@queue.push(item)
|
24
27
|
end
|
25
28
|
|
26
|
-
def start
|
27
|
-
if @running.value
|
28
|
-
@config.logger.debug('segments worker already running.')
|
29
|
-
return
|
30
|
-
end
|
31
|
-
|
32
|
-
@running.make_true
|
33
|
-
perform_thread
|
34
|
-
end
|
35
|
-
|
36
29
|
def stop
|
37
|
-
unless @running.value
|
38
|
-
@config.logger.debug('segments worker not running.')
|
39
|
-
return
|
40
|
-
end
|
41
|
-
|
42
|
-
@running.make_false
|
43
30
|
SplitIoClient::Helpers::ThreadHelper.stop(:segment_update_worker, @config)
|
31
|
+
@queue = nil
|
44
32
|
end
|
45
33
|
|
46
34
|
private
|
@@ -8,53 +8,35 @@ module SplitIoClient
|
|
8
8
|
@synchronizer = synchronizer
|
9
9
|
@config = config
|
10
10
|
@splits_repository = splits_repository
|
11
|
-
@queue = Queue.new
|
12
|
-
@running = Concurrent::AtomicBoolean.new(false)
|
13
11
|
end
|
14
12
|
|
15
13
|
def start
|
16
|
-
if @
|
17
|
-
@config.logger.debug('splits worker already running.')
|
18
|
-
return
|
19
|
-
end
|
14
|
+
return if SplitIoClient::Helpers::ThreadHelper.alive?(:split_update_worker, @config)
|
20
15
|
|
21
|
-
@
|
16
|
+
@queue = Queue.new
|
22
17
|
perform_thread
|
23
18
|
end
|
24
19
|
|
25
|
-
def stop
|
26
|
-
unless @running.value
|
27
|
-
@config.logger.debug('splits worker not running.')
|
28
|
-
return
|
29
|
-
end
|
30
|
-
|
31
|
-
@running.make_false
|
32
|
-
SplitIoClient::Helpers::ThreadHelper.stop(:split_update_worker, @config)
|
33
|
-
end
|
34
|
-
|
35
20
|
def add_to_queue(change_number)
|
36
|
-
|
37
|
-
@config.logger.debug('splits worker not running.')
|
38
|
-
return
|
39
|
-
end
|
21
|
+
return if @queue.nil?
|
40
22
|
|
41
23
|
@config.logger.debug("SplitsWorker add to queue #{change_number}")
|
42
24
|
@queue.push(change_number)
|
43
25
|
end
|
44
26
|
|
45
27
|
def kill_split(change_number, split_name, default_treatment)
|
46
|
-
|
47
|
-
@config.logger.debug('splits worker not running.')
|
48
|
-
return
|
49
|
-
end
|
50
|
-
|
51
|
-
return if @splits_repository.get_change_number.to_i > change_number
|
28
|
+
return if @queue.nil?
|
52
29
|
|
53
30
|
@config.logger.debug("SplitsWorker kill #{split_name}, #{change_number}")
|
54
31
|
@splits_repository.kill(change_number, split_name, default_treatment)
|
55
32
|
add_to_queue(change_number)
|
56
33
|
end
|
57
34
|
|
35
|
+
def stop
|
36
|
+
SplitIoClient::Helpers::ThreadHelper.stop(:split_update_worker, @config)
|
37
|
+
@queue = nil
|
38
|
+
end
|
39
|
+
|
58
40
|
private
|
59
41
|
|
60
42
|
def perform
|
data/splitclient-rb.gemspec
CHANGED
@@ -55,7 +55,7 @@ Gem::Specification.new do |spec|
|
|
55
55
|
spec.add_runtime_dependency 'jwt', '>= 2.2.1'
|
56
56
|
spec.add_runtime_dependency 'lru_redux'
|
57
57
|
spec.add_runtime_dependency 'net-http-persistent', '>= 2.9'
|
58
|
-
spec.add_runtime_dependency 'redis', '>=
|
58
|
+
spec.add_runtime_dependency 'redis', '>= 3.2'
|
59
59
|
spec.add_runtime_dependency 'socketry', '~> 0.5.1'
|
60
60
|
spec.add_runtime_dependency 'thread_safe', '>= 0.3'
|
61
61
|
end
|
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.2.0
|
4
|
+
version: 7.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Split Software
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: allocation_stats
|
@@ -268,14 +268,14 @@ dependencies:
|
|
268
268
|
requirements:
|
269
269
|
- - ">="
|
270
270
|
- !ruby/object:Gem::Version
|
271
|
-
version:
|
271
|
+
version: '3.2'
|
272
272
|
type: :runtime
|
273
273
|
prerelease: false
|
274
274
|
version_requirements: !ruby/object:Gem::Requirement
|
275
275
|
requirements:
|
276
276
|
- - ">="
|
277
277
|
- !ruby/object:Gem::Version
|
278
|
-
version:
|
278
|
+
version: '3.2'
|
279
279
|
- !ruby/object:Gem::Dependency
|
280
280
|
name: socketry
|
281
281
|
requirement: !ruby/object:Gem::Requirement
|
@@ -425,7 +425,6 @@ files:
|
|
425
425
|
- lib/splitclient-rb/split_logger.rb
|
426
426
|
- lib/splitclient-rb/sse/event_source/back_off.rb
|
427
427
|
- lib/splitclient-rb/sse/event_source/client.rb
|
428
|
-
- lib/splitclient-rb/sse/event_source/event_parser.rb
|
429
428
|
- lib/splitclient-rb/sse/event_source/event_types.rb
|
430
429
|
- lib/splitclient-rb/sse/event_source/stream_data.rb
|
431
430
|
- lib/splitclient-rb/sse/notification_manager_keeper.rb
|
@@ -455,9 +454,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
455
454
|
version: '0'
|
456
455
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
457
456
|
requirements:
|
458
|
-
- - "
|
457
|
+
- - ">="
|
459
458
|
- !ruby/object:Gem::Version
|
460
|
-
version:
|
459
|
+
version: '0'
|
461
460
|
requirements: []
|
462
461
|
rubygems_version: 3.0.6
|
463
462
|
signing_key:
|
@@ -1,55 +0,0 @@
|
|
1
|
-
# frozen_string_literal: false
|
2
|
-
|
3
|
-
module SplitIoClient
|
4
|
-
module SSE
|
5
|
-
module EventSource
|
6
|
-
class EventParser
|
7
|
-
def initialize(config)
|
8
|
-
@config = config
|
9
|
-
end
|
10
|
-
|
11
|
-
def parse(raw_event)
|
12
|
-
type = nil
|
13
|
-
events = []
|
14
|
-
buffer = read_partial_data(raw_event)
|
15
|
-
|
16
|
-
buffer.each do |d|
|
17
|
-
splited_data = d.split(':')
|
18
|
-
|
19
|
-
case splited_data[0]
|
20
|
-
when 'event'
|
21
|
-
type = splited_data[1].strip
|
22
|
-
when 'data'
|
23
|
-
data = parse_event_data(d, type)
|
24
|
-
events << StreamData.new(type, data[:client_id], data[:data], data[:channel]) unless type.nil? || data[:data].nil?
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
events
|
29
|
-
rescue StandardError => e
|
30
|
-
@config.logger.error("Error during parsing a event: #{e.inspect}")
|
31
|
-
[]
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def parse_event_data(data, type)
|
37
|
-
event_data = JSON.parse(data.sub('data: ', ''))
|
38
|
-
client_id = event_data['clientId']&.strip
|
39
|
-
channel = event_data['channel']&.strip
|
40
|
-
parsed_data = JSON.parse(event_data['data']) unless type == 'error'
|
41
|
-
parsed_data = event_data if type == 'error'
|
42
|
-
|
43
|
-
{ client_id: client_id, channel: channel, data: parsed_data }
|
44
|
-
end
|
45
|
-
|
46
|
-
def read_partial_data(data)
|
47
|
-
buffer = ''
|
48
|
-
buffer << data
|
49
|
-
buffer.chomp!
|
50
|
-
buffer.split("\n")
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|