splitclient-rb 7.2.2-java → 7.3.0.pre.rc1-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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +15 -0
  3. data/CHANGES.txt +6 -0
  4. data/lib/splitclient-rb.rb +24 -9
  5. data/lib/splitclient-rb/cache/adapters/redis_adapter.rb +4 -0
  6. data/lib/splitclient-rb/cache/fetchers/segment_fetcher.rb +16 -7
  7. data/lib/splitclient-rb/cache/fetchers/split_fetcher.rb +9 -9
  8. data/lib/splitclient-rb/cache/repositories/events/memory_repository.rb +6 -3
  9. data/lib/splitclient-rb/cache/repositories/events_repository.rb +4 -3
  10. data/lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb +8 -0
  11. data/lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb +2 -0
  12. data/lib/splitclient-rb/cache/repositories/repository.rb +0 -4
  13. data/lib/splitclient-rb/cache/repositories/segments_repository.rb +20 -0
  14. data/lib/splitclient-rb/cache/repositories/splits_repository.rb +4 -0
  15. data/lib/splitclient-rb/cache/senders/localhost_repo_cleaner.rb +1 -3
  16. data/lib/splitclient-rb/cache/stores/sdk_blocker.rb +9 -0
  17. data/lib/splitclient-rb/clients/split_client.rb +59 -25
  18. data/lib/splitclient-rb/constants.rb +6 -1
  19. data/lib/splitclient-rb/engine/api/client.rb +3 -2
  20. data/lib/splitclient-rb/engine/api/events.rb +10 -1
  21. data/lib/splitclient-rb/engine/api/impressions.rb +19 -2
  22. data/lib/splitclient-rb/engine/api/segments.rb +20 -18
  23. data/lib/splitclient-rb/engine/api/splits.rb +10 -10
  24. data/lib/splitclient-rb/engine/api/telemetry_api.rb +39 -0
  25. data/lib/splitclient-rb/engine/auth_api_client.rb +21 -8
  26. data/lib/splitclient-rb/engine/common/impressions_manager.rb +27 -3
  27. data/lib/splitclient-rb/engine/metrics/binary_search_latency_tracker.rb +3 -65
  28. data/lib/splitclient-rb/engine/push_manager.rb +12 -3
  29. data/lib/splitclient-rb/engine/sync_manager.rb +85 -46
  30. data/lib/splitclient-rb/engine/synchronizer.rb +14 -22
  31. data/lib/splitclient-rb/split_config.rb +46 -21
  32. data/lib/splitclient-rb/split_factory.rb +31 -13
  33. data/lib/splitclient-rb/split_factory_registry.rb +12 -0
  34. data/lib/splitclient-rb/sse/event_source/client.rb +53 -28
  35. data/lib/splitclient-rb/sse/event_source/event_parser.rb +10 -1
  36. data/lib/splitclient-rb/sse/notification_manager_keeper.rb +45 -26
  37. data/lib/splitclient-rb/sse/sse_handler.rb +16 -21
  38. data/lib/splitclient-rb/sse/workers/segments_worker.rb +5 -4
  39. data/lib/splitclient-rb/sse/workers/splits_worker.rb +6 -3
  40. data/lib/splitclient-rb/telemetry/domain/constants.rb +42 -0
  41. data/lib/splitclient-rb/telemetry/domain/structs.rb +31 -0
  42. data/lib/splitclient-rb/telemetry/evaluation_consumer.rb +14 -0
  43. data/lib/splitclient-rb/telemetry/evaluation_producer.rb +21 -0
  44. data/lib/splitclient-rb/telemetry/init_consumer.rb +14 -0
  45. data/lib/splitclient-rb/telemetry/init_producer.rb +19 -0
  46. data/lib/splitclient-rb/telemetry/memory/memory_evaluation_consumer.rb +32 -0
  47. data/lib/splitclient-rb/telemetry/memory/memory_evaluation_producer.rb +24 -0
  48. data/lib/splitclient-rb/telemetry/memory/memory_init_consumer.rb +28 -0
  49. data/lib/splitclient-rb/telemetry/memory/memory_init_producer.rb +34 -0
  50. data/lib/splitclient-rb/telemetry/memory/memory_runtime_consumer.rb +112 -0
  51. data/lib/splitclient-rb/telemetry/memory/memory_runtime_producer.rb +81 -0
  52. data/lib/splitclient-rb/telemetry/memory/memory_synchronizer.rb +192 -0
  53. data/lib/splitclient-rb/telemetry/redis/redis_evaluation_producer.rb +38 -0
  54. data/lib/splitclient-rb/telemetry/redis/redis_init_producer.rb +37 -0
  55. data/lib/splitclient-rb/telemetry/redis/redis_synchronizer.rb +28 -0
  56. data/lib/splitclient-rb/telemetry/runtime_consumer.rb +24 -0
  57. data/lib/splitclient-rb/telemetry/runtime_producer.rb +24 -0
  58. data/lib/splitclient-rb/telemetry/storages/memory.rb +139 -0
  59. data/lib/splitclient-rb/telemetry/sync_task.rb +38 -0
  60. data/lib/splitclient-rb/telemetry/synchronizer.rb +29 -0
  61. data/lib/splitclient-rb/version.rb +1 -1
  62. metadata +26 -11
  63. data/lib/splitclient-rb/cache/repositories/metrics/memory_repository.rb +0 -163
  64. data/lib/splitclient-rb/cache/repositories/metrics/redis_repository.rb +0 -131
  65. data/lib/splitclient-rb/cache/repositories/metrics_repository.rb +0 -23
  66. data/lib/splitclient-rb/cache/senders/metrics_sender.rb +0 -55
  67. data/lib/splitclient-rb/engine/api/metrics.rb +0 -61
  68. data/lib/splitclient-rb/engine/metrics/metrics.rb +0 -80
  69. data/lib/splitclient-rb/redis_metrics_fixer.rb +0 -36
@@ -5,19 +5,22 @@ module SplitIoClient
5
5
  class SSEHandler
6
6
  attr_reader :sse_client
7
7
 
8
- def initialize(config, synchronizer, splits_repository, segments_repository, notification_manager_keeper)
9
- @config = config
8
+ def initialize(metadata,
9
+ synchronizer,
10
+ repositories,
11
+ notification_manager_keeper,
12
+ telemetry_runtime_producer)
13
+ @config = metadata[:config]
10
14
  @notification_manager_keeper = notification_manager_keeper
11
- @splits_worker = SplitIoClient::SSE::Workers::SplitsWorker.new(synchronizer, config, splits_repository)
12
- @segments_worker = SplitIoClient::SSE::Workers::SegmentsWorker.new(synchronizer, config, segments_repository)
13
- @notification_processor = SplitIoClient::SSE::NotificationProcessor.new(config, @splits_worker, @segments_worker)
14
- @sse_client = SSE::EventSource::Client.new(@config) do |client|
15
+ @splits_worker = SplitIoClient::SSE::Workers::SplitsWorker.new(synchronizer, @config, repositories[:splits])
16
+ @segments_worker = SplitIoClient::SSE::Workers::SegmentsWorker.new(synchronizer, @config, repositories[:segments])
17
+ @notification_processor = SplitIoClient::SSE::NotificationProcessor.new(@config, @splits_worker, @segments_worker)
18
+ @sse_client = SSE::EventSource::Client.new(@config, metadata[:api_key], telemetry_runtime_producer) do |client|
15
19
  client.on_event { |event| handle_incoming_message(event) }
16
- client.on_connected { process_connected }
17
- client.on_disconnect { |reconnect| process_disconnect(reconnect) }
20
+ client.on_action { |action| process_action(action) }
18
21
  end
19
22
 
20
- @on = { connected: ->(_) {}, disconnect: ->(_) {} }
23
+ @on = { action: ->(_) {} }
21
24
 
22
25
  yield self if block_given?
23
26
  end
@@ -48,22 +51,14 @@ module SplitIoClient
48
51
  @segments_worker.stop
49
52
  end
50
53
 
51
- def on_connected(&action)
52
- @on[:connected] = action
53
- end
54
-
55
- def on_disconnect(&action)
56
- @on[:disconnect] = action
57
- end
58
-
59
- def process_disconnect(reconnect)
60
- @on[:disconnect].call(reconnect)
54
+ def on_action(&action)
55
+ @on[:action] = action
61
56
  end
62
57
 
63
58
  private
64
59
 
65
- def process_connected
66
- @on[:connected].call
60
+ def process_action(action)
61
+ @on[:action].call(action)
67
62
  end
68
63
 
69
64
  def handle_incoming_message(notification)
@@ -48,12 +48,13 @@ module SplitIoClient
48
48
  def perform
49
49
  while (item = @queue.pop)
50
50
  segment_name = item[:segment_name]
51
- change_number = item[:change_number]
52
- since = @segments_repository.get_change_number(segment_name)
51
+ cn = item[:change_number]
52
+ @config.logger.debug("SegmentsWorker change_number dequeue #{segment_name}, #{cn}")
53
53
 
54
- unless since >= change_number
55
- @config.logger.debug("SegmentsWorker fetch_segment with #{since}")
54
+ attempt = 0
55
+ while cn > @segments_repository.get_change_number(segment_name).to_i && attempt <= Workers::MAX_RETRIES_ALLOWED
56
56
  @synchronizer.fetch_segment(segment_name)
57
+ attempt += 1
57
58
  end
58
59
  end
59
60
  end
@@ -3,6 +3,8 @@
3
3
  module SplitIoClient
4
4
  module SSE
5
5
  module Workers
6
+ MAX_RETRIES_ALLOWED = 10
7
+
6
8
  class SplitsWorker
7
9
  def initialize(synchronizer, config, splits_repository)
8
10
  @synchronizer = synchronizer
@@ -59,11 +61,12 @@ module SplitIoClient
59
61
 
60
62
  def perform
61
63
  while (change_number = @queue.pop)
62
- since = @splits_repository.get_change_number
64
+ @config.logger.debug("SplitsWorker change_number dequeue #{change_number}")
63
65
 
64
- unless since.to_i >= change_number
65
- @config.logger.debug("SplitsWorker fetch_splits with #{since}")
66
+ attempt = 0
67
+ while change_number > @splits_repository.get_change_number.to_i && attempt <= Workers::MAX_RETRIES_ALLOWED
66
68
  @synchronizer.fetch_splits
69
+ attempt += 1
67
70
  end
68
71
  end
69
72
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ module Domain
6
+ class Constants
7
+ BUR_TIMEOUT = 'bur_timeout'
8
+ NON_READY_USAGES = 'non_ready_usages'
9
+
10
+ IMPRESSIONS_DROPPED = 'impressions_dropped'
11
+ IMPRESSIONS_DEDUPE = 'impressions_deduped'
12
+ IMPRESSIONS_QUEUED = 'impressions_queued'
13
+
14
+ EVENTS_DROPPED = 'events_dropped'
15
+ EVENTS_QUEUED = 'events_queued'
16
+
17
+ SPLIT_SYNC = 'split_sync'
18
+ SEGMENT_SYNC = 'segment_sync'
19
+ IMPRESSIONS_SYNC = 'impressions_sync'
20
+ IMPRESSION_COUNT_SYNC = 'impression_count_sync'
21
+ EVENT_SYNC = 'event_sync'
22
+ TELEMETRY_SYNC = 'telemetry_sync'
23
+ TOKEN_SYNC = 'token_sync'
24
+
25
+ SSE_CONNECTION_ESTABLISHED = 0
26
+ OCCUPANCY_PRI = 10
27
+ OCCUPANCY_SEC = 20
28
+ STREAMING_STATUS = 30
29
+ CONNECTION_ERROR = 40
30
+ TOKEN_REFRESH = 50
31
+ ABLY_ERROR = 60
32
+ SYNC_MODE = 70
33
+
34
+ TREATMENT = 'treatment'
35
+ TREATMENTS = 'treatments'
36
+ TREATMENT_WITH_CONFIG = 'treatment_with_config'
37
+ TREATMENTS_WITH_CONFIG = 'treatments_with_config'
38
+ TRACK = 'track'
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ # sp: splits, se: segments, im: impressions, ic:impression count, ev: events, te: telemetry, to: token.
6
+ LastSynchronization = Struct.new(:sp, :se, :im, :ic, :ev, :te, :to)
7
+ HttpErrors = Struct.new(:sp, :se, :im, :ic, :ev, :te, :to)
8
+ HttpLatencies = Struct.new(:sp, :se, :im, :ic, :ev, :te, :to)
9
+
10
+ # sp: splits, se: segmentos, im: impressions, ev: events, t: telemetry
11
+ Rates = Struct.new(:sp, :se, :im, :ev, :te)
12
+
13
+ # s: sdkUrl, e: eventsUrl, a: authUrl, st: streamUrl, t: telemetryUrl
14
+ UrlOverrides = Struct.new(:s, :e, :a, :st, :t)
15
+
16
+ # om: operationMode, se: streamingEnabled, st: storage, rr: refreshRate, uo: urlOverrides, iq: impressionsQueueSize,
17
+ # eq: eventsQueueSize, im: impressionsMode, il: impressionListenerEnabled, hp: httpProxyDetected, af: activeFactories,
18
+ # rf: redundantActiveFactories, tr: timeUntilSdkReady, bt: burTimeouts, nr: sdkNotReadyUsage, t: tags, i: integrations
19
+ ConfigInit = Struct.new(:om, :st, :af, :rf, :t, :se, :rr, :uo, :iq, :eq, :im, :il, :hp, :tr, :bt, :nr, :i)
20
+
21
+ # ls: lastSynchronization, ml: clientMethodLatencies, me: clientMethodExceptions, he: httpErros, hl: httpLatencies,
22
+ # tr: tokenRefreshes, ar: authRejections, iq: impressionsQueued, ide: impressionsDeduped, idr: impressionsDropped,
23
+ # spc: splitsCount, sec: segmentCount, skc: segmentKeyCount, sl: sessionLengthMs, eq: eventsQueued, ed: eventsDropped,
24
+ # se: streamingEvents, t: tags
25
+ Usage = Struct.new(:ls, :ml, :me, :he, :hl, :tr, :ar, :iq, :ide, :idr, :spc, :sec, :skc, :sl, :eq, :ed, :se, :t)
26
+
27
+ # t: treatment, ts: treatments, tc: treatmentWithConfig, tcs: treatmentsWithConfig, tr: track
28
+ ClientMethodLatencies = Struct.new(:t, :ts, :tc, :tcs, :tr)
29
+ ClientMethodExceptions = Struct.new(:t, :ts, :tc, :tcs, :tr)
30
+ end
31
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class EvaluationConsumer
6
+ extend Forwardable
7
+ def_delegators :@evaluation, :pop_latencies, :pop_exceptions
8
+
9
+ def initialize(config)
10
+ @evaluation = SplitIoClient::Telemetry::MemoryEvaluationConsumer.new(config)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class EvaluationProducer
6
+ extend Forwardable
7
+ def_delegators :@evaluation,
8
+ :record_latency,
9
+ :record_exception
10
+
11
+ def initialize(config)
12
+ @evaluation = case config.telemetry_adapter.class.to_s
13
+ when 'SplitIoClient::Cache::Adapters::RedisAdapter'
14
+ SplitIoClient::Telemetry::RedisEvaluationProducer.new(config)
15
+ else
16
+ SplitIoClient::Telemetry::MemoryEvaluationProducer.new(config)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class InitConsumer
6
+ extend Forwardable
7
+ def_delegators :@init, :non_ready_usages, :bur_timeouts
8
+
9
+ def initialize(config)
10
+ @init = SplitIoClient::Telemetry::MemoryInitConsumer.new(config)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class InitProducer
6
+ extend Forwardable
7
+ def_delegators :@init, :record_config, :record_non_ready_usages, :record_bur_timeout
8
+
9
+ def initialize(config)
10
+ @init = case config.telemetry_adapter.class.to_s
11
+ when 'SplitIoClient::Cache::Adapters::RedisAdapter'
12
+ SplitIoClient::Telemetry::RedisInitProducer.new(config)
13
+ else
14
+ SplitIoClient::Telemetry::MemoryInitProducer.new(config)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class MemoryEvaluationConsumer < EvaluationConsumer
6
+ def initialize(config)
7
+ @config = config
8
+ @adapter = config.telemetry_adapter
9
+ end
10
+
11
+ def pop_latencies
12
+ to_return = @adapter.latencies.each_with_object({}) do |latency, memo|
13
+ memo[latency[:method]] = latency[:latencies]
14
+ end
15
+
16
+ @adapter.init_latencies
17
+
18
+ to_return
19
+ end
20
+
21
+ def pop_exceptions
22
+ to_return = @adapter.exceptions.each_with_object({}) do |exception, memo|
23
+ memo[exception[:method]] = exception[:exceptions].value
24
+ end
25
+
26
+ @adapter.init_exceptions
27
+
28
+ to_return
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class MemoryEvaluationProducer < EvaluationProducer
6
+ def initialize(config)
7
+ @config = config
8
+ @adapter = config.telemetry_adapter
9
+ end
10
+
11
+ def record_latency(method, bucket)
12
+ @adapter.latencies.find { |l| l[:method] == method }[:latencies][bucket] += 1
13
+ rescue StandardError => error
14
+ @config.log_found_exception(__method__.to_s, error)
15
+ end
16
+
17
+ def record_exception(method)
18
+ @adapter.exceptions.find { |l| l[:method] == method }[:exceptions].increment
19
+ rescue StandardError => error
20
+ @config.log_found_exception(__method__.to_s, error)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class MemoryInitConsumer < InitConsumer
6
+ DEFAULT_VALUE = 0
7
+
8
+ def initialize(config)
9
+ @config = config
10
+ @adapter = config.telemetry_adapter
11
+ end
12
+
13
+ def non_ready_usages
14
+ find_counts(Domain::Constants::NON_READY_USAGES)
15
+ end
16
+
17
+ def bur_timeouts
18
+ find_counts(Domain::Constants::BUR_TIMEOUT)
19
+ end
20
+
21
+ private
22
+
23
+ def find_counts(action)
24
+ @adapter.factory_counters.find { |l| l[:action] == action }[:counts].value
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class MemoryInitProducer < InitProducer
6
+ def initialize(config)
7
+ @config = config
8
+ @adapter = config.telemetry_adapter
9
+ end
10
+
11
+ def record_config
12
+ # no op
13
+ end
14
+
15
+ def record_bur_timeout
16
+ find_factory_counters(Domain::Constants::BUR_TIMEOUT)[:counts].increment
17
+ rescue StandardError => error
18
+ @config.log_found_exception(__method__.to_s, error)
19
+ end
20
+
21
+ def record_non_ready_usages
22
+ find_factory_counters(Domain::Constants::NON_READY_USAGES)[:counts].increment
23
+ rescue StandardError => error
24
+ @config.log_found_exception(__method__.to_s, error)
25
+ end
26
+
27
+ private
28
+
29
+ def find_factory_counters(action)
30
+ @adapter.factory_counters.find { |l| l[:action] == action }
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SplitIoClient
4
+ module Telemetry
5
+ class MemoryRuntimeConsumer < RuntimeConsumer
6
+ DEFAULT_VALUE = 0
7
+
8
+ def initialize(config)
9
+ @config = config
10
+ @adapter = config.telemetry_adapter
11
+ end
12
+
13
+ def pop_tags
14
+ to_return = @adapter.tags
15
+
16
+ @adapter.init_tags
17
+
18
+ to_return
19
+ end
20
+
21
+ def impressions_stats(type)
22
+ @adapter.impressions_data_records.find { |l| l[:type] == type }[:value].value
23
+ end
24
+
25
+ def events_stats(type)
26
+ @adapter.events_data_records.find { |l| l[:type] == type }[:value].value
27
+ end
28
+
29
+ def last_synchronizations
30
+ splits = find_last_synchronization(Domain::Constants::SPLIT_SYNC)
31
+ segments = find_last_synchronization(Domain::Constants::SEGMENT_SYNC)
32
+ impressions = find_last_synchronization(Domain::Constants::IMPRESSIONS_SYNC)
33
+ imp_count = find_last_synchronization(Domain::Constants::IMPRESSION_COUNT_SYNC)
34
+ events = find_last_synchronization(Domain::Constants::EVENT_SYNC)
35
+ telemetry = find_last_synchronization(Domain::Constants::TELEMETRY_SYNC)
36
+ token = find_last_synchronization(Domain::Constants::TOKEN_SYNC)
37
+
38
+ LastSynchronization.new(splits, segments, impressions, imp_count, events, telemetry, token)
39
+ end
40
+
41
+ def pop_http_errors
42
+ splits = find_http_errors(Domain::Constants::SPLIT_SYNC)
43
+ segments = find_http_errors(Domain::Constants::SEGMENT_SYNC)
44
+ impressions = find_http_errors(Domain::Constants::IMPRESSIONS_SYNC)
45
+ imp_count = find_http_errors(Domain::Constants::IMPRESSION_COUNT_SYNC)
46
+ events = find_http_errors(Domain::Constants::EVENT_SYNC)
47
+ telemetry = find_http_errors(Domain::Constants::TELEMETRY_SYNC)
48
+ token = find_http_errors(Domain::Constants::TOKEN_SYNC)
49
+
50
+ @adapter.init_http_errors
51
+
52
+ HttpErrors.new(splits, segments, impressions, imp_count, events, telemetry, token)
53
+ end
54
+
55
+ def pop_http_latencies
56
+ splits = find_http_latencies(Domain::Constants::SPLIT_SYNC)
57
+ segments = find_http_latencies(Domain::Constants::SEGMENT_SYNC)
58
+ impressions = find_http_latencies(Domain::Constants::IMPRESSIONS_SYNC)
59
+ imp_count = find_http_latencies(Domain::Constants::IMPRESSION_COUNT_SYNC)
60
+ events = find_http_latencies(Domain::Constants::EVENT_SYNC)
61
+ telemetry = find_http_latencies(Domain::Constants::TELEMETRY_SYNC)
62
+ token = find_http_latencies(Domain::Constants::TOKEN_SYNC)
63
+
64
+ @adapter.init_http_latencies
65
+
66
+ HttpLatencies.new(splits, segments, impressions, imp_count, events, telemetry, token)
67
+ end
68
+
69
+ def pop_auth_rejections
70
+ to_return = @adapter.auth_rejections
71
+
72
+ @adapter.init_auth_rejections
73
+
74
+ to_return.value
75
+ end
76
+
77
+ def pop_token_refreshes
78
+ to_return = @adapter.token_refreshes
79
+
80
+ @adapter.init_token_refreshes
81
+
82
+ to_return.value
83
+ end
84
+
85
+ def pop_streaming_events
86
+ events = @adapter.streaming_events
87
+
88
+ @adapter.init_streaming_events.map
89
+
90
+ events
91
+ end
92
+
93
+ def session_length
94
+ @adapter.session_length.value
95
+ end
96
+
97
+ private
98
+
99
+ def find_last_synchronization(type)
100
+ @adapter.last_synchronization.find { |l| l[:type] == type }[:value].value
101
+ end
102
+
103
+ def find_http_errors(type)
104
+ @adapter.http_errors.find { |l| l[:type] == type }[:value]
105
+ end
106
+
107
+ def find_http_latencies(type)
108
+ @adapter.http_latencies.find { |l| l[:type] == type }[:value]
109
+ end
110
+ end
111
+ end
112
+ end