From 4dd96866ac1c0b4df804f3d69e3607b5042e02b6 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 11 Mar 2026 10:14:56 -0700 Subject: [PATCH 1/7] - fixed multiple events fire with segment update - fixed logging debug if config debug enabled --- .../cache/repositories/segments_repository.rb | 17 ++++++------ lib/splitclient-rb/clients/split_client.rb | 4 +-- lib/splitclient-rb/engine/api/splits.rb | 4 +-- lib/splitclient-rb/engine/auth_api_client.rb | 6 ++--- .../engine/events/events_manager.rb | 8 +++++- lib/splitclient-rb/engine/sync_manager.rb | 12 ++++----- lib/splitclient-rb/sse/event_source/client.rb | 27 +++++++++---------- .../sse/event_source/event_parser.rb | 4 +-- .../sse/notification_manager_keeper.rb | 6 ++--- .../sse/workers/segments_worker.rb | 8 +++--- .../sse/workers/splits_worker.rb | 10 +++---- lib/splitclient-rb/version.rb | 2 +- spec/splitclient/split_factory_spec.rb | 3 --- 13 files changed, 57 insertions(+), 54 deletions(-) diff --git a/lib/splitclient-rb/cache/repositories/segments_repository.rb b/lib/splitclient-rb/cache/repositories/segments_repository.rb index 900da206..7115d1d3 100644 --- a/lib/splitclient-rb/cache/repositories/segments_repository.rb +++ b/lib/splitclient-rb/cache/repositories/segments_repository.rb @@ -23,18 +23,19 @@ def add_to_segment(segment) name = segment[:name] @adapter.initialize_set(segment_data(name)) unless @adapter.exists?(segment_data(name)) - add_keys(name, segment[:added]) remove_keys(name, segment[:removed]) - @internal_events_queue.push( - SplitIoClient::Engine::Models::SdkInternalEventNotification.new( - SplitIoClient::Engine::Models::SdkInternalEvent::SEGMENTS_UPDATED, - SplitIoClient::Engine::Models::EventsMetadata.new( - SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE, - [] + if segment[:added].length > 0 || segment[:removed].length > 0 + @internal_events_queue.push( + SplitIoClient::Engine::Models::SdkInternalEventNotification.new( + SplitIoClient::Engine::Models::SdkInternalEvent::SEGMENTS_UPDATED, + SplitIoClient::Engine::Models::EventsMetadata.new( + SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE, + [] + ) ) ) - ) + end end def get_segment_keys(name) diff --git a/lib/splitclient-rb/clients/split_client.rb b/lib/splitclient-rb/clients/split_client.rb index c4abe7eb..c350b719 100644 --- a/lib/splitclient-rb/clients/split_client.rb +++ b/lib/splitclient-rb/clients/split_client.rb @@ -118,11 +118,11 @@ def destroy @config.logger.info('Split client shutdown started...') if @config.debug_enabled if !@config.cache_adapter.is_a?(SplitIoClient::Cache::Adapters::RedisAdapter) && @config.impressions_mode != :none && (!@impressions_repository.empty? || !@events_repository.empty?) - @config.logger.debug("Impressions and/or Events cache is not empty") + @config.logger.debug("Impressions and/or Events cache is not empty") if @config.debug_enabled # Adding small delay to ensure sender threads are fully running sleep(0.1) if !@config.threads.key?(:impressions_sender) || !@config.threads.key?(:events_sender) - @config.logger.debug("Periodic data recording thread has not started yet, waiting for service startup.") + @config.logger.debug("Periodic data recording thread has not started yet, waiting for service startup.") if @config.debug_enabled @config.threads[:start_sdk].join(5) if @config.threads.key?(:start_sdk) end end diff --git a/lib/splitclient-rb/engine/api/splits.rb b/lib/splitclient-rb/engine/api/splits.rb index 887adb26..6ecd1473 100644 --- a/lib/splitclient-rb/engine/api/splits.rb +++ b/lib/splitclient-rb/engine/api/splits.rb @@ -24,7 +24,7 @@ def since(since, since_rbs, fetch_options = { cache_control_headers: false, till if check_last_proxy_check_timestamp @spec_version = SplitIoClient::Spec::FeatureFlags::SPEC_VERSION - @config.logger.debug("Switching to new Feature flag spec #{@spec_version} and fetching.") + @config.logger.debug("Switching to new Feature flag spec #{@spec_version} and fetching.") if @config.debug_enabled @old_spec_since = since since = -1 since_rbs = -1 @@ -41,7 +41,7 @@ def since(since, since_rbs, fetch_options = { cache_control_headers: false, till params[:sets] = @flag_sets_filter.join(",") unless @flag_sets_filter.empty? params[:till] = fetch_options[:till] unless fetch_options[:till].nil? - @config.logger.debug("Fetching from splitChanges with #{params}: ") + @config.logger.debug("Fetching from splitChanges with #{params}: ") if @config.debug_enabled response = get_api("#{@config.base_uri}/splitChanges", @api_key, params, fetch_options[:cache_control_headers]) if response.status == 414 @config.logger.error("Error fetching feature flags; the amount of flag sets provided are too big, causing uri length error.") diff --git a/lib/splitclient-rb/engine/auth_api_client.rb b/lib/splitclient-rb/engine/auth_api_client.rb index 475842a2..d35e99e9 100644 --- a/lib/splitclient-rb/engine/auth_api_client.rb +++ b/lib/splitclient-rb/engine/auth_api_client.rb @@ -21,10 +21,10 @@ def authenticate(api_key) return process_error(response) if response.status >= 400 && response.status < 500 @telemetry_runtime_producer.record_sync_error(Telemetry::Domain::Constants::TOKEN_SYNC, response.status.to_i) - @config.logger.debug("Error connecting to: #{@config.auth_service_url}. Response status: #{response.status}") + @config.logger.debug("Error connecting to: #{@config.auth_service_url}. Response status: #{response.status}") if @config.debug_enabled { push_enabled: false, retry: true } rescue StandardError => e - @config.logger.debug("AuthApiClient error: #{e.inspect}.") + @config.logger.debug("AuthApiClient error: #{e.inspect}.") if @config.debug_enabled { push_enabled: false, retry: false } end @@ -51,7 +51,7 @@ def decode_token(token) end def process_error(response) - @config.logger.debug("Error connecting to: #{@config.auth_service_url}. Response status: #{response.status}") + @config.logger.debug("Error connecting to: #{@config.auth_service_url}. Response status: #{response.status}") if @config.debug_enabled @telemetry_runtime_producer.record_auth_rejections if response.status == 401 { push_enabled: false, retry: false } diff --git a/lib/splitclient-rb/engine/events/events_manager.rb b/lib/splitclient-rb/engine/events/events_manager.rb index c2d687f0..f488ccd2 100644 --- a/lib/splitclient-rb/engine/events/events_manager.rb +++ b/lib/splitclient-rb/engine/events/events_manager.rb @@ -48,7 +48,7 @@ def notify_internal_event(sdk_internal_event, event_metadata) end # if client is not subscribed to SDK_READY - if sorted_event == SplitIoClient::Engine::Models::SdkEvent::SDK_READY && get_event_handler(sorted_event).nil? + if check_if_register_needed(sorted_event) @config.logger.debug('EventsManager: Registering SDK_READY event as fired') if @config.debug_enabled @active_subscriptions[Engine::Models::SdkEvent::SDK_READY] = Engine::Models::EventActiveSubscriptions.new(true, nil) end @@ -65,6 +65,12 @@ def destroy private + def check_if_register_needed(sorted_event) + sorted_event == SplitIoClient::Engine::Models::SdkEvent::SDK_READY && + get_event_handler(sorted_event).nil? && + !@active_subscriptions.include?(sorted_event) + end + def fire_sdk_event(sdk_event, event_metadata) @config.logger.debug("EventsManager: Firing Sdk event: #{sdk_event}") if @config.debug_enabled @config.threads[:sdk_event_notify] = Thread.new do diff --git a/lib/splitclient-rb/engine/sync_manager.rb b/lib/splitclient-rb/engine/sync_manager.rb index d1f35c66..ff8de241 100644 --- a/lib/splitclient-rb/engine/sync_manager.rb +++ b/lib/splitclient-rb/engine/sync_manager.rb @@ -47,13 +47,13 @@ def start_thread connected = false if @config.streaming_enabled - @config.logger.debug('Starting Streaming mode ...') + @config.logger.debug('Starting Streaming mode ...') if @config.debug_enabled start_push_status_monitor connected = @push_manager.start_sse end unless connected - @config.logger.debug('Starting Polling mode ...') + @config.logger.debug('Starting Polling mode ...') if @config.debug_enabled @synchronizer.start_periodic_fetch record_telemetry(Telemetry::Domain::Constants::SYNC_MODE, SYNC_MODE_POLLING) end @@ -92,7 +92,7 @@ def process_push_shutdown def process_connected if @sse_connected.value - @config.logger.debug('Streaming already connected.') + @config.logger.debug('Streaming already connected.') if @config.debug_enabled return end @@ -107,7 +107,7 @@ def process_connected def process_forced_stop unless @sse_connected.value - @config.logger.debug('Streaming already disconnected.') + @config.logger.debug('Streaming already disconnected.') if @config.debug_enabled return end @@ -120,7 +120,7 @@ def process_forced_stop def process_disconnect(reconnect) unless @sse_connected.value - @config.logger.debug('Streaming already disconnected.') + @config.logger.debug('Streaming already disconnected.') if @config.debug_enabled return end @@ -169,7 +169,7 @@ def incoming_push_status_handler when Constants::PUSH_SUBSYSTEM_OFF process_push_shutdown else - @config.logger.debug('Incorrect push status type.') + @config.logger.debug('Incorrect push status type.') if @config.debug_enabled end end rescue StandardError => e diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index bb07d76a..5190ad6e 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -38,23 +38,23 @@ def initialize(config, def close(status = nil) unless connected? - @config.logger.debug('SSEClient already disconected.') + @config.logger.debug('SSEClient already disconected.') if @config.debug_enabled return end - @config.logger.debug("Closing SSEClient socket") + @config.logger.debug("Closing SSEClient socket") if @config.debug_enabled push_status(status) @connected.make_false @socket.sync_close = true if @socket.is_a? OpenSSL::SSL::SSLSocket @socket.close - @config.logger.debug("SSEClient socket state #{@socket.state}") if @socket.is_a? OpenSSL::SSL::SSLSocket + @config.logger.debug("SSEClient socket state #{@socket.state}") if @socket.is_a? OpenSSL::SSL::SSLSocket && @config.debug_enabled rescue StandardError => e @config.logger.error("SSEClient close Error: #{e.inspect}") end def start(url) if connected? - @config.logger.debug('SSEClient already running.') + @config.logger.debug('SSEClient already running.') if @config.debug_enabled return true end @@ -96,18 +96,17 @@ def connect_stream(latch) raise 'eof exception' if partial_data == :eof rescue IO::WaitReadable => e - @config.logger.debug("SSE client IO::WaitReadable transient error: #{e.inspect}") + @config.logger.debug("SSE client IO::WaitReadable transient error: #{e.inspect}") if @config.debug_enabled IO.select([@socket], nil, nil, @read_timeout) retry rescue Errno::EAGAIN => e - @config.logger.debug("SSE client transient error: #{e.inspect}") + @config.logger.debug("SSE client transient error: #{e.inspect}") if @config.debug_enabled IO.select([@socket], nil, nil, @read_timeout) retry rescue Errno::ETIMEDOUT => e @config.logger.error("SSE read operation timed out!: #{e.inspect}") return Constants::PUSH_RETRYABLE_ERROR rescue EOFError => e - puts "SSE read operation EOF Exception!: #{e.inspect}" @config.logger.error("SSE read operation EOF Exception!: #{e.inspect}") raise 'eof exception' rescue Errno::EBADF, IOError => e @@ -125,12 +124,12 @@ def connect_stream(latch) return Constants::PUSH_RETRYABLE_ERROR end rescue Errno::EBADF - @config.logger.debug("SSE socket is not connected (Errno::EBADF)") + @config.logger.debug("SSE socket is not connected (Errno::EBADF)") if @config.debug_enabled break rescue RuntimeError raise 'eof exception' rescue Exception => e - @config.logger.debug("SSE socket is not connected: #{e.inspect}") + @config.logger.debug("SSE socket is not connected: #{e.inspect}") if @config.debug_enabled break end @@ -156,7 +155,7 @@ def read_first_event(data, latch) return unless @first_event.value response_code = @event_parser.first_event(data) - @config.logger.debug("SSE client first event code: #{response_code}") + @config.logger.debug("SSE client first event code: #{response_code}") if @config.debug_enabled error_event = false events = @event_parser.parse(data) @@ -165,7 +164,7 @@ def read_first_event(data, latch) if response_code == OK_CODE && !error_event @connected.make_true - @config.logger.debug("SSE client first event Connected is true") + @config.logger.debug("SSE client first event Connected is true") if @config.debug_enabled @telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::SSE_CONNECTION_ESTABLISHED, nil) push_status(Constants::PUSH_CONNECTED) end @@ -202,7 +201,7 @@ def socket_connect end def process_data(partial_data) - @config.logger.debug("Event partial data: #{partial_data}") + @config.logger.debug("Event partial data: #{partial_data}") if @config.debug_enabled return if partial_data.nil? || partial_data == KEEP_ALIVE_RESPONSE events = @event_parser.parse(partial_data) @@ -220,7 +219,7 @@ def build_request(uri) req << "SplitSDKMachineName: #{@config.machine_name}\r\n" req << "SplitSDKClientKey: #{@api_key.split(//).last(4).join}\r\n" unless @api_key.nil? req << "Cache-Control: no-cache\r\n\r\n" - @config.logger.debug("Request info: #{req}") + @config.logger.debug("Request info: #{req}") if @config.debug_enabled req end @@ -255,7 +254,7 @@ def dispatch_event(event) def push_status(status) return if status.nil? - @config.logger.debug("Pushing new sse status: #{status}") + @config.logger.debug("Pushing new sse status: #{status}") if @config.debug_enabled @status_queue.push(status) end end diff --git a/lib/splitclient-rb/sse/event_source/event_parser.rb b/lib/splitclient-rb/sse/event_source/event_parser.rb index 566cb5c2..8983c9d7 100644 --- a/lib/splitclient-rb/sse/event_source/event_parser.rb +++ b/lib/splitclient-rb/sse/event_source/event_parser.rb @@ -29,14 +29,14 @@ def parse(raw_event) events rescue StandardError => e - @config.logger.debug("Error during parsing a event: #{e.inspect}") + @config.logger.debug("Error during parsing a event: #{e.inspect}") if @config.debug_enabled [] end def first_event(raw_data) raw_data.split("\n")[0].split(' ')[1].to_i rescue StandardError => e - @config.logger.debug("Error parsing first event: #{e.inspect}") + @config.logger.error("Error parsing first event: #{e.inspect}") BAD_REQUEST_CODE end diff --git a/lib/splitclient-rb/sse/notification_manager_keeper.rb b/lib/splitclient-rb/sse/notification_manager_keeper.rb index 33ff2b96..34b24581 100644 --- a/lib/splitclient-rb/sse/notification_manager_keeper.rb +++ b/lib/splitclient-rb/sse/notification_manager_keeper.rb @@ -42,12 +42,12 @@ def process_event_control(type) @telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::STREAMING_STATUS, DISABLED) push_status(Constants::PUSH_SUBSYSTEM_OFF) else - @config.logger.error("Incorrect event type: #{incoming_notification}") + @config.logger.error("Incorrect event type: #{incoming_notification}") if @config.debug_enabled end end def process_event_occupancy(channel, publishers) - @config.logger.debug("Processed occupancy event with #{publishers} publishers. Channel: #{channel}") + @config.logger.debug("Processed occupancy event with #{publishers} publishers. Channel: #{channel}") if @config.debug_enabled update_publishers(channel, publishers) @@ -76,7 +76,7 @@ def are_publishers_available? end def push_status(status) - @config.logger.debug("Pushing occupancy status: #{status}") + @config.logger.debug("Pushing occupancy status: #{status}") if @config.debug_enabled @status_queue.push(status) end end diff --git a/lib/splitclient-rb/sse/workers/segments_worker.rb b/lib/splitclient-rb/sse/workers/segments_worker.rb index a241c72d..828e7c2d 100644 --- a/lib/splitclient-rb/sse/workers/segments_worker.rb +++ b/lib/splitclient-rb/sse/workers/segments_worker.rb @@ -14,13 +14,13 @@ def initialize(synchronizer, config, segments_repository) def add_to_queue(change_number, segment_name) item = { change_number: change_number, segment_name: segment_name } - @config.logger.debug("SegmentsWorker add to queue #{item}") + @config.logger.debug("SegmentsWorker add to queue #{item}") if @config.debug_enabled @queue.push(item) end def start if @running.value - @config.logger.debug('segments worker already running.') + @config.logger.debug('segments worker already running.') if @config.debug_enabled return end @@ -30,7 +30,7 @@ def start def stop unless @running.value - @config.logger.debug('segments worker not running.') + @config.logger.debug('segments worker not running.') if @config.debug_enabled return end @@ -44,7 +44,7 @@ def perform while (item = @queue.pop) segment_name = item[:segment_name] cn = item[:change_number] - @config.logger.debug("SegmentsWorker change_number dequeue #{segment_name}, #{cn}") + @config.logger.debug("SegmentsWorker change_number dequeue #{segment_name}, #{cn}") if @config.debug_enabled @synchronizer.fetch_segment(segment_name, cn) end diff --git a/lib/splitclient-rb/sse/workers/splits_worker.rb b/lib/splitclient-rb/sse/workers/splits_worker.rb index dc15eb2c..ab873f85 100644 --- a/lib/splitclient-rb/sse/workers/splits_worker.rb +++ b/lib/splitclient-rb/sse/workers/splits_worker.rb @@ -18,7 +18,7 @@ def initialize(synchronizer, config, feature_flags_repository, telemetry_runtime def start if @running.value - @config.logger.debug('feature_flags_worker already running.') + @config.logger.debug('feature_flags_worker already running.') if @config.debug_enabled return end @@ -28,7 +28,7 @@ def start def stop unless @running.value - @config.logger.debug('feature_flags_worker not running.') + @config.logger.debug('feature_flags_worker not running.') if @config.debug_enabled return end @@ -37,7 +37,7 @@ def stop end def add_to_queue(notification) - @config.logger.debug("feature_flags_worker add to queue #{notification.data['changeNumber']}") + @config.logger.debug("feature_flags_worker add to queue #{notification.data['changeNumber']}") if @config.debug_enabled @queue.push(notification) end @@ -52,7 +52,7 @@ def perform_thread def perform while (notification = @queue.pop) - @config.logger.debug("feature_flags_worker change_number dequeue #{notification.data['changeNumber']}") + @config.logger.debug("feature_flags_worker change_number dequeue #{notification.data['changeNumber']}") if @config.debug_enabled case notification.data['type'] when SSE::EventSource::EventTypes::SPLIT_UPDATE success = update_feature_flag(notification) @@ -117,7 +117,7 @@ def update_rule_based_segment(notification) def kill_feature_flag(notification) return if @feature_flags_repository.get_change_number.to_i > notification.data['changeNumber'] - @config.logger.debug("feature_flags_worker kill #{notification.data['splitName']}, #{notification.data['changeNumber']}") + @config.logger.debug("feature_flags_worker kill #{notification.data['splitName']}, #{notification.data['changeNumber']}") if @config.debug_enabled @feature_flags_repository.kill(notification.data['changeNumber'], notification.data['splitName'], notification.data['defaultTreatment']) diff --git a/lib/splitclient-rb/version.rb b/lib/splitclient-rb/version.rb index 5b66f95f..ba58bfec 100644 --- a/lib/splitclient-rb/version.rb +++ b/lib/splitclient-rb/version.rb @@ -1,3 +1,3 @@ module SplitIoClient - VERSION = '8.11.0' + VERSION = '8.11.0-rc2' end diff --git a/spec/splitclient/split_factory_spec.rb b/spec/splitclient/split_factory_spec.rb index dd0ef73a..42af6904 100644 --- a/spec/splitclient/split_factory_spec.rb +++ b/spec/splitclient/split_factory_spec.rb @@ -129,9 +129,6 @@ expect(factory.instance_variable_get(:@config).valid_mode).to be false expect(factory.manager.split('test_split')) .to be nil - - puts '###### log' - puts log.string end end From 455e84db73033fa58263028c83e971f9a89f68ac Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 11 Mar 2026 10:26:48 -0700 Subject: [PATCH 2/7] polishing --- lib/splitclient-rb/engine/auth_api_client.rb | 8 ++++++-- lib/splitclient-rb/engine/sync_manager.rb | 20 +++++++++++-------- .../sse/workers/splits_worker.rb | 8 ++++++-- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/splitclient-rb/engine/auth_api_client.rb b/lib/splitclient-rb/engine/auth_api_client.rb index d35e99e9..f3b7c5c6 100644 --- a/lib/splitclient-rb/engine/auth_api_client.rb +++ b/lib/splitclient-rb/engine/auth_api_client.rb @@ -21,7 +21,9 @@ def authenticate(api_key) return process_error(response) if response.status >= 400 && response.status < 500 @telemetry_runtime_producer.record_sync_error(Telemetry::Domain::Constants::TOKEN_SYNC, response.status.to_i) - @config.logger.debug("Error connecting to: #{@config.auth_service_url}. Response status: #{response.status}") if @config.debug_enabled + if @config.debug_enabled + @config.logger.debug("Error connecting to: #{@config.auth_service_url}. Response status: #{response.status}") + end { push_enabled: false, retry: true } rescue StandardError => e @config.logger.debug("AuthApiClient error: #{e.inspect}.") if @config.debug_enabled @@ -51,7 +53,9 @@ def decode_token(token) end def process_error(response) - @config.logger.debug("Error connecting to: #{@config.auth_service_url}. Response status: #{response.status}") if @config.debug_enabled + if @config.debug_enabled + @config.logger.debug("Error connecting to: #{@config.auth_service_url}. Response status: #{response.status}") + end @telemetry_runtime_producer.record_auth_rejections if response.status == 401 { push_enabled: false, retry: false } diff --git a/lib/splitclient-rb/engine/sync_manager.rb b/lib/splitclient-rb/engine/sync_manager.rb index ff8de241..0deb9b24 100644 --- a/lib/splitclient-rb/engine/sync_manager.rb +++ b/lib/splitclient-rb/engine/sync_manager.rb @@ -47,13 +47,13 @@ def start_thread connected = false if @config.streaming_enabled - @config.logger.debug('Starting Streaming mode ...') if @config.debug_enabled + log_if_debug('Starting Streaming mode ...') start_push_status_monitor connected = @push_manager.start_sse end unless connected - @config.logger.debug('Starting Polling mode ...') if @config.debug_enabled + log_if_debug('Starting Polling mode ...') @synchronizer.start_periodic_fetch record_telemetry(Telemetry::Domain::Constants::SYNC_MODE, SYNC_MODE_POLLING) end @@ -92,7 +92,7 @@ def process_push_shutdown def process_connected if @sse_connected.value - @config.logger.debug('Streaming already connected.') if @config.debug_enabled + log_if_debug('Streaming already connected.') return end @@ -107,7 +107,7 @@ def process_connected def process_forced_stop unless @sse_connected.value - @config.logger.debug('Streaming already disconnected.') if @config.debug_enabled + log_if_debug('Streaming already disconnected.') return end @@ -120,7 +120,7 @@ def process_forced_stop def process_disconnect(reconnect) unless @sse_connected.value - @config.logger.debug('Streaming already disconnected.') if @config.debug_enabled + log_if_debug('Streaming already disconnected.') return end @@ -144,14 +144,14 @@ def record_telemetry(type, data) def start_push_status_monitor @config.threads[:push_status_handler] = Thread.new do - @config.logger.debug('Starting push status handler ...') if @config.debug_enabled + log_if_debug('Starting push status handler ...') incoming_push_status_handler end end def incoming_push_status_handler while (status = @status_queue.pop) - @config.logger.debug("Push status handler dequeue #{status}") if @config.debug_enabled + log_if_debug("Push status handler dequeue #{status}") case status when Constants::PUSH_CONNECTED @@ -169,12 +169,16 @@ def incoming_push_status_handler when Constants::PUSH_SUBSYSTEM_OFF process_push_shutdown else - @config.logger.debug('Incorrect push status type.') if @config.debug_enabled + log_if_debug('Incorrect push status type.') end end rescue StandardError => e @config.logger.error("Push status handler error: #{e.inspect}") end end + + def log_if_debug(msg) + @config.logger.debug(msg) if @config.debug_enabled + end end end diff --git a/lib/splitclient-rb/sse/workers/splits_worker.rb b/lib/splitclient-rb/sse/workers/splits_worker.rb index ab873f85..7fffc1f0 100644 --- a/lib/splitclient-rb/sse/workers/splits_worker.rb +++ b/lib/splitclient-rb/sse/workers/splits_worker.rb @@ -52,7 +52,9 @@ def perform_thread def perform while (notification = @queue.pop) - @config.logger.debug("feature_flags_worker change_number dequeue #{notification.data['changeNumber']}") if @config.debug_enabled + if @config.debug_enabled + @config.logger.debug("feature_flags_worker change_number dequeue #{notification.data['changeNumber']}") + end case notification.data['type'] when SSE::EventSource::EventTypes::SPLIT_UPDATE success = update_feature_flag(notification) @@ -117,7 +119,9 @@ def update_rule_based_segment(notification) def kill_feature_flag(notification) return if @feature_flags_repository.get_change_number.to_i > notification.data['changeNumber'] - @config.logger.debug("feature_flags_worker kill #{notification.data['splitName']}, #{notification.data['changeNumber']}") if @config.debug_enabled + if @config.debug_enabled + @config.logger.debug("feature_flags_worker kill #{notification.data['splitName']}, #{notification.data['changeNumber']}") + end @feature_flags_repository.kill(notification.data['changeNumber'], notification.data['splitName'], notification.data['defaultTreatment']) From 55fa95e9ce16f4978fc0037ebc61b2f0aaa48f90 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 11 Mar 2026 11:48:01 -0700 Subject: [PATCH 3/7] used relative load for events models classes --- .../rule_based_segments_repository.rb | 12 +++++++---- .../cache/repositories/segments_repository.rb | 13 ++++++++---- .../cache/repositories/splits_repository.rb | 20 +++++++++++-------- .../engine/events/events_manager.rb | 19 +++++++++--------- .../models/sdk_internal_event_notification.rb | 14 +++++++------ lib/splitclient-rb/engine/status_manager.rb | 6 ++++-- lib/splitclient-rb/engine/sync_manager.rb | 14 ++++++------- spec/sse/event_source/client_spec.rb | 4 ++-- 8 files changed, 60 insertions(+), 42 deletions(-) diff --git a/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb b/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb index 67f339fe..1b35c6d5 100644 --- a/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb +++ b/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb @@ -1,4 +1,8 @@ require 'concurrent' +require_relative '../../engine/models/sdk_internal_event_notification.rb' +require_relative '../../engine/models/events_metadata.rb' +require_relative '../../engine/models/sdk_internal_event.rb' +require_relative '../../engine/models/sdk_event_type.rb' module SplitIoClient module Cache @@ -50,10 +54,10 @@ def update(to_add, to_delete, new_change_number) if to_add.length > 0 || to_delete.length > 0 @internal_events_queue.push( - SplitIoClient::Engine::Models::SdkInternalEventNotification.new( - SplitIoClient::Engine::Models::SdkInternalEvent::RB_SEGMENTS_UPDATED, - SplitIoClient::Engine::Models::EventsMetadata.new( - SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE, + SdkInternalEventNotification.new( + SdkInternalEvent::RB_SEGMENTS_UPDATED, + EventsMetadata.new( + SdkEventType::SEGMENTS_UPDATE, [] ) ) diff --git a/lib/splitclient-rb/cache/repositories/segments_repository.rb b/lib/splitclient-rb/cache/repositories/segments_repository.rb index 7115d1d3..39cc3f53 100644 --- a/lib/splitclient-rb/cache/repositories/segments_repository.rb +++ b/lib/splitclient-rb/cache/repositories/segments_repository.rb @@ -1,3 +1,8 @@ +require_relative '../../engine/models/sdk_internal_event_notification.rb' +require_relative '../../engine/models/events_metadata.rb' +require_relative '../../engine/models/sdk_internal_event.rb' +require_relative '../../engine/models/sdk_event_type.rb' + module SplitIoClient module Cache module Repositories @@ -27,10 +32,10 @@ def add_to_segment(segment) remove_keys(name, segment[:removed]) if segment[:added].length > 0 || segment[:removed].length > 0 @internal_events_queue.push( - SplitIoClient::Engine::Models::SdkInternalEventNotification.new( - SplitIoClient::Engine::Models::SdkInternalEvent::SEGMENTS_UPDATED, - SplitIoClient::Engine::Models::EventsMetadata.new( - SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE, + SdkInternalEventNotification.new( + SdkInternalEvent::SEGMENTS_UPDATED, + EventsMetadata.new( + SdkEventType::SEGMENTS_UPDATE, [] ) ) diff --git a/lib/splitclient-rb/cache/repositories/splits_repository.rb b/lib/splitclient-rb/cache/repositories/splits_repository.rb index f9a8acbb..496f7496 100644 --- a/lib/splitclient-rb/cache/repositories/splits_repository.rb +++ b/lib/splitclient-rb/cache/repositories/splits_repository.rb @@ -1,4 +1,8 @@ require 'concurrent' +require_relative '../../engine/models/sdk_internal_event_notification.rb' +require_relative '../../engine/models/events_metadata.rb' +require_relative '../../engine/models/sdk_internal_event.rb' +require_relative '../../engine/models/sdk_event_type.rb' module SplitIoClient module Cache @@ -57,10 +61,10 @@ def update(to_add, to_delete, new_change_number) if to_add.length > 0 || to_delete.length > 0 @internal_events_queue.push( - SplitIoClient::Engine::Models::SdkInternalEventNotification.new( - SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED, - SplitIoClient::Engine::Models::EventsMetadata.new( - SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE, + SdkInternalEventNotification.new( + SdkInternalEvent::FLAGS_UPDATED, + EventsMetadata.new( + SdkEventType::FLAG_UPDATE, to_add.map {|flag| flag[:name]} | to_delete.map {|flag| flag[:name]} ) ) @@ -154,10 +158,10 @@ def kill(change_number, split_name, default_treatment) @adapter.set_string(namespace_key(".split.#{split_name}"), split.to_json) @internal_events_queue.push( - SplitIoClient::Engine::Models::SdkInternalEventNotification.new( - SplitIoClient::Engine::Models::SdkInternalEvent::FLAG_KILLED_NOTIFICATION, - SplitIoClient::Engine::Models::EventsMetadata.new( - SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE, + SdkInternalEventNotification.new( + SdkInternalEvent::FLAG_KILLED_NOTIFICATION, + EventsMetadata.new( + SdkEventType::FLAG_UPDATE, [split_name] ) ) diff --git a/lib/splitclient-rb/engine/events/events_manager.rb b/lib/splitclient-rb/engine/events/events_manager.rb index f488ccd2..86d83eb6 100644 --- a/lib/splitclient-rb/engine/events/events_manager.rb +++ b/lib/splitclient-rb/engine/events/events_manager.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true +include SplitIoClient::Engine::Models module SplitIoClient module Engine @@ -18,15 +19,15 @@ def register(sdk_event, event_handler) @mutex.synchronize do # SDK ready already fired - if sdk_event == SplitIoClient::Engine::Models::SdkEvent::SDK_READY && event_already_triggered(sdk_event) - @active_subscriptions[sdk_event] = SplitIoClient::Engine::Models::EventActiveSubscriptions.new(true, event_handler) + if sdk_event == SdkEvent::SDK_READY && event_already_triggered(sdk_event) + @active_subscriptions[sdk_event] = EventActiveSubscriptions.new(true, event_handler) @config.logger.debug('EventsManager: Firing SDK_READY event for new subscription') if @config.debug_enabled fire_sdk_event(sdk_event, nil) return end @config.logger.debug("EventsManager: Register event: #{sdk_event}") if @config.debug_enabled - @active_subscriptions[sdk_event] = SplitIoClient::Engine::Models::EventActiveSubscriptions.new(false, event_handler) + @active_subscriptions[sdk_event] = EventActiveSubscriptions.new(false, event_handler) end end @@ -50,7 +51,7 @@ def notify_internal_event(sdk_internal_event, event_metadata) # if client is not subscribed to SDK_READY if check_if_register_needed(sorted_event) @config.logger.debug('EventsManager: Registering SDK_READY event as fired') if @config.debug_enabled - @active_subscriptions[Engine::Models::SdkEvent::SDK_READY] = Engine::Models::EventActiveSubscriptions.new(true, nil) + @active_subscriptions[SdkEvent::SDK_READY] = EventActiveSubscriptions.new(true, nil) end end end @@ -66,7 +67,7 @@ def destroy private def check_if_register_needed(sorted_event) - sorted_event == SplitIoClient::Engine::Models::SdkEvent::SDK_READY && + sorted_event == SdkEvent::SDK_READY && get_event_handler(sorted_event).nil? && !@active_subscriptions.include?(sorted_event) end @@ -110,7 +111,7 @@ def get_event_handler(sdk_event) end def get_sdk_event_if_applicable(sdk_internal_event) - final_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(nil, false) + final_sdk_event = ValidSdkEvent.new(nil, false) events_to_fire = [] require_any_sdk_event = check_require_any(sdk_internal_event) @@ -118,7 +119,7 @@ def get_sdk_event_if_applicable(sdk_internal_event) if (!event_already_triggered(require_any_sdk_event.sdk_event) && execution_limit(require_any_sdk_event.sdk_event) == 1) || execution_limit(require_any_sdk_event.sdk_event) == -1 - final_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new( + final_sdk_event = ValidSdkEvent.new( require_any_sdk_event.sdk_event, check_prerequisites(require_any_sdk_event.sdk_event) && check_suppressed_by(require_any_sdk_event.sdk_event) @@ -178,10 +179,10 @@ def execution_limit(sdk_event) end def check_require_any(sdk_internal_event) - valid_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(nil, false) + valid_sdk_event = ValidSdkEvent.new(nil, false) @manager_config.require_any.each do |name, val| if val.include?(sdk_internal_event) - valid_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(name, true) + valid_sdk_event = ValidSdkEvent.new(name, true) return valid_sdk_event end end diff --git a/lib/splitclient-rb/engine/models/sdk_internal_event_notification.rb b/lib/splitclient-rb/engine/models/sdk_internal_event_notification.rb index e202c707..b88f60d4 100644 --- a/lib/splitclient-rb/engine/models/sdk_internal_event_notification.rb +++ b/lib/splitclient-rb/engine/models/sdk_internal_event_notification.rb @@ -1,13 +1,15 @@ # frozen_string_literal: false module SplitIoClient - module Engine::Models - class SdkInternalEventNotification - attr_reader :internal_event, :metadata + module Engine + module Models + class SdkInternalEventNotification + attr_reader :internal_event, :metadata - def initialize(internal_event, metadata) - @internal_event = internal_event - @metadata = metadata + def initialize(internal_event, metadata) + @internal_event = internal_event + @metadata = metadata + end end end end diff --git a/lib/splitclient-rb/engine/status_manager.rb b/lib/splitclient-rb/engine/status_manager.rb index e5ed19d1..85ad2667 100644 --- a/lib/splitclient-rb/engine/status_manager.rb +++ b/lib/splitclient-rb/engine/status_manager.rb @@ -1,4 +1,6 @@ # frozen_string_literal: true +require_relative './models/sdk_internal_event_notification.rb' +require_relative './models/sdk_internal_event.rb' module SplitIoClient module Engine @@ -21,8 +23,8 @@ def ready! @sdk_ready.count_down @config.logger.info('SplitIO SDK is ready') @internal_events_queue.push( - SplitIoClient::Engine::Models::SdkInternalEventNotification.new( - SplitIoClient::Engine::Models::SdkInternalEvent::SDK_READY, nil + SdkInternalEventNotification.new( + SdkInternalEvent::SDK_READY, nil ) ) end diff --git a/lib/splitclient-rb/engine/sync_manager.rb b/lib/splitclient-rb/engine/sync_manager.rb index 0deb9b24..8bb78b4b 100644 --- a/lib/splitclient-rb/engine/sync_manager.rb +++ b/lib/splitclient-rb/engine/sync_manager.rb @@ -47,13 +47,13 @@ def start_thread connected = false if @config.streaming_enabled - log_if_debug('Starting Streaming mode ...') + @config.logger.debug('Starting Streaming mode ...') if @config.debug_enabled start_push_status_monitor connected = @push_manager.start_sse end unless connected - log_if_debug('Starting Polling mode ...') + @config.logger.debug('Starting Polling mode ...') if @config.debug_enabled @synchronizer.start_periodic_fetch record_telemetry(Telemetry::Domain::Constants::SYNC_MODE, SYNC_MODE_POLLING) end @@ -92,7 +92,7 @@ def process_push_shutdown def process_connected if @sse_connected.value - log_if_debug('Streaming already connected.') + @config.logger.debug('Streaming already connected.') if @config.debug_enabled return end @@ -107,7 +107,7 @@ def process_connected def process_forced_stop unless @sse_connected.value - log_if_debug('Streaming already disconnected.') + @config.logger.debug('Streaming already disconnected.') if @config.debug_enabled return end @@ -120,7 +120,7 @@ def process_forced_stop def process_disconnect(reconnect) unless @sse_connected.value - log_if_debug('Streaming already disconnected.') + @config.logger.debug('Streaming already disconnected.') if @config.debug_enabled return end @@ -144,14 +144,14 @@ def record_telemetry(type, data) def start_push_status_monitor @config.threads[:push_status_handler] = Thread.new do - log_if_debug('Starting push status handler ...') + @config.logger.debug('Starting push status handler ...') if @config.debug_enabled incoming_push_status_handler end end def incoming_push_status_handler while (status = @status_queue.pop) - log_if_debug("Push status handler dequeue #{status}") + @config.logger.debug("Push status handler dequeue #{status}") if @config.debug_enabled case status when Constants::PUSH_CONNECTED diff --git a/spec/sse/event_source/client_spec.rb b/spec/sse/event_source/client_spec.rb index 909cb6f5..ce4cccdd 100644 --- a/spec/sse/event_source/client_spec.rb +++ b/spec/sse/event_source/client_spec.rb @@ -9,7 +9,7 @@ let(:log) { StringIO.new } let(:events_queue) { Queue.new } - let(:config) { SplitIoClient::SplitConfig.new(logger: Logger.new(log)) } + let(:config) { SplitIoClient::SplitConfig.new(logger: Logger.new(log), debug_enabled: true) } let(:telemetry_runtime_producer) { SplitIoClient::Telemetry::RuntimeProducer.new(config) } let(:telemetry_runtime_consumer) { SplitIoClient::Telemetry::RuntimeConsumer.new(config) } let(:api_token) { 'api-token-test' } @@ -332,7 +332,7 @@ it 'test retry with IO::WaitReadable exceptions' do log2 = StringIO.new - config2 = SplitIoClient::SplitConfig.new(logger: Logger.new(log2)) + config2 = SplitIoClient::SplitConfig.new(logger: Logger.new(log2), debug_enabled: true) mock_server do |server| server.setup_response('/') do |_, res| From b289f74566c32ccc0608c37de7e06aafbb5376ae Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 11 Mar 2026 13:13:00 -0700 Subject: [PATCH 4/7] fixed sync_manager errors --- .../rule_based_segments_repository.rb | 12 ++++------- .../cache/repositories/segments_repository.rb | 13 ++++-------- .../cache/repositories/splits_repository.rb | 20 ++++++++----------- .../engine/events/events_manager.rb | 19 +++++++++--------- lib/splitclient-rb/engine/status_manager.rb | 6 ++---- 5 files changed, 27 insertions(+), 43 deletions(-) diff --git a/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb b/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb index 1b35c6d5..67f339fe 100644 --- a/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb +++ b/lib/splitclient-rb/cache/repositories/rule_based_segments_repository.rb @@ -1,8 +1,4 @@ require 'concurrent' -require_relative '../../engine/models/sdk_internal_event_notification.rb' -require_relative '../../engine/models/events_metadata.rb' -require_relative '../../engine/models/sdk_internal_event.rb' -require_relative '../../engine/models/sdk_event_type.rb' module SplitIoClient module Cache @@ -54,10 +50,10 @@ def update(to_add, to_delete, new_change_number) if to_add.length > 0 || to_delete.length > 0 @internal_events_queue.push( - SdkInternalEventNotification.new( - SdkInternalEvent::RB_SEGMENTS_UPDATED, - EventsMetadata.new( - SdkEventType::SEGMENTS_UPDATE, + SplitIoClient::Engine::Models::SdkInternalEventNotification.new( + SplitIoClient::Engine::Models::SdkInternalEvent::RB_SEGMENTS_UPDATED, + SplitIoClient::Engine::Models::EventsMetadata.new( + SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE, [] ) ) diff --git a/lib/splitclient-rb/cache/repositories/segments_repository.rb b/lib/splitclient-rb/cache/repositories/segments_repository.rb index 39cc3f53..7115d1d3 100644 --- a/lib/splitclient-rb/cache/repositories/segments_repository.rb +++ b/lib/splitclient-rb/cache/repositories/segments_repository.rb @@ -1,8 +1,3 @@ -require_relative '../../engine/models/sdk_internal_event_notification.rb' -require_relative '../../engine/models/events_metadata.rb' -require_relative '../../engine/models/sdk_internal_event.rb' -require_relative '../../engine/models/sdk_event_type.rb' - module SplitIoClient module Cache module Repositories @@ -32,10 +27,10 @@ def add_to_segment(segment) remove_keys(name, segment[:removed]) if segment[:added].length > 0 || segment[:removed].length > 0 @internal_events_queue.push( - SdkInternalEventNotification.new( - SdkInternalEvent::SEGMENTS_UPDATED, - EventsMetadata.new( - SdkEventType::SEGMENTS_UPDATE, + SplitIoClient::Engine::Models::SdkInternalEventNotification.new( + SplitIoClient::Engine::Models::SdkInternalEvent::SEGMENTS_UPDATED, + SplitIoClient::Engine::Models::EventsMetadata.new( + SplitIoClient::Engine::Models::SdkEventType::SEGMENTS_UPDATE, [] ) ) diff --git a/lib/splitclient-rb/cache/repositories/splits_repository.rb b/lib/splitclient-rb/cache/repositories/splits_repository.rb index 496f7496..f9a8acbb 100644 --- a/lib/splitclient-rb/cache/repositories/splits_repository.rb +++ b/lib/splitclient-rb/cache/repositories/splits_repository.rb @@ -1,8 +1,4 @@ require 'concurrent' -require_relative '../../engine/models/sdk_internal_event_notification.rb' -require_relative '../../engine/models/events_metadata.rb' -require_relative '../../engine/models/sdk_internal_event.rb' -require_relative '../../engine/models/sdk_event_type.rb' module SplitIoClient module Cache @@ -61,10 +57,10 @@ def update(to_add, to_delete, new_change_number) if to_add.length > 0 || to_delete.length > 0 @internal_events_queue.push( - SdkInternalEventNotification.new( - SdkInternalEvent::FLAGS_UPDATED, - EventsMetadata.new( - SdkEventType::FLAG_UPDATE, + SplitIoClient::Engine::Models::SdkInternalEventNotification.new( + SplitIoClient::Engine::Models::SdkInternalEvent::FLAGS_UPDATED, + SplitIoClient::Engine::Models::EventsMetadata.new( + SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE, to_add.map {|flag| flag[:name]} | to_delete.map {|flag| flag[:name]} ) ) @@ -158,10 +154,10 @@ def kill(change_number, split_name, default_treatment) @adapter.set_string(namespace_key(".split.#{split_name}"), split.to_json) @internal_events_queue.push( - SdkInternalEventNotification.new( - SdkInternalEvent::FLAG_KILLED_NOTIFICATION, - EventsMetadata.new( - SdkEventType::FLAG_UPDATE, + SplitIoClient::Engine::Models::SdkInternalEventNotification.new( + SplitIoClient::Engine::Models::SdkInternalEvent::FLAG_KILLED_NOTIFICATION, + SplitIoClient::Engine::Models::EventsMetadata.new( + SplitIoClient::Engine::Models::SdkEventType::FLAG_UPDATE, [split_name] ) ) diff --git a/lib/splitclient-rb/engine/events/events_manager.rb b/lib/splitclient-rb/engine/events/events_manager.rb index 86d83eb6..10273c75 100644 --- a/lib/splitclient-rb/engine/events/events_manager.rb +++ b/lib/splitclient-rb/engine/events/events_manager.rb @@ -1,5 +1,4 @@ # frozen_string_literal: true -include SplitIoClient::Engine::Models module SplitIoClient module Engine @@ -19,15 +18,15 @@ def register(sdk_event, event_handler) @mutex.synchronize do # SDK ready already fired - if sdk_event == SdkEvent::SDK_READY && event_already_triggered(sdk_event) - @active_subscriptions[sdk_event] = EventActiveSubscriptions.new(true, event_handler) + if sdk_event == SplitIoClient::Engine::Models::SdkEvent::SDK_READY && event_already_triggered(sdk_event) + @active_subscriptions[sdk_event] = SplitIoClient::Engine::Models::EventActiveSubscriptions.new(true, event_handler) @config.logger.debug('EventsManager: Firing SDK_READY event for new subscription') if @config.debug_enabled fire_sdk_event(sdk_event, nil) return end @config.logger.debug("EventsManager: Register event: #{sdk_event}") if @config.debug_enabled - @active_subscriptions[sdk_event] = EventActiveSubscriptions.new(false, event_handler) + @active_subscriptions[sdk_event] = SplitIoClient::Engine::Models::EventActiveSubscriptions.new(false, event_handler) end end @@ -51,7 +50,7 @@ def notify_internal_event(sdk_internal_event, event_metadata) # if client is not subscribed to SDK_READY if check_if_register_needed(sorted_event) @config.logger.debug('EventsManager: Registering SDK_READY event as fired') if @config.debug_enabled - @active_subscriptions[SdkEvent::SDK_READY] = EventActiveSubscriptions.new(true, nil) + @active_subscriptions[SplitIoClient::Engine::Models::SdkEvent::SDK_READY] = SplitIoClient::Engine::Models::EventActiveSubscriptions.new(true, nil) end end end @@ -67,7 +66,7 @@ def destroy private def check_if_register_needed(sorted_event) - sorted_event == SdkEvent::SDK_READY && + sorted_event == SplitIoClient::Engine::Models::SdkEvent::SDK_READY && get_event_handler(sorted_event).nil? && !@active_subscriptions.include?(sorted_event) end @@ -111,7 +110,7 @@ def get_event_handler(sdk_event) end def get_sdk_event_if_applicable(sdk_internal_event) - final_sdk_event = ValidSdkEvent.new(nil, false) + final_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(nil, false) events_to_fire = [] require_any_sdk_event = check_require_any(sdk_internal_event) @@ -119,7 +118,7 @@ def get_sdk_event_if_applicable(sdk_internal_event) if (!event_already_triggered(require_any_sdk_event.sdk_event) && execution_limit(require_any_sdk_event.sdk_event) == 1) || execution_limit(require_any_sdk_event.sdk_event) == -1 - final_sdk_event = ValidSdkEvent.new( + final_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new( require_any_sdk_event.sdk_event, check_prerequisites(require_any_sdk_event.sdk_event) && check_suppressed_by(require_any_sdk_event.sdk_event) @@ -179,10 +178,10 @@ def execution_limit(sdk_event) end def check_require_any(sdk_internal_event) - valid_sdk_event = ValidSdkEvent.new(nil, false) + valid_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(nil, false) @manager_config.require_any.each do |name, val| if val.include?(sdk_internal_event) - valid_sdk_event = ValidSdkEvent.new(name, true) + valid_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(name, true) return valid_sdk_event end end diff --git a/lib/splitclient-rb/engine/status_manager.rb b/lib/splitclient-rb/engine/status_manager.rb index 85ad2667..e5ed19d1 100644 --- a/lib/splitclient-rb/engine/status_manager.rb +++ b/lib/splitclient-rb/engine/status_manager.rb @@ -1,6 +1,4 @@ # frozen_string_literal: true -require_relative './models/sdk_internal_event_notification.rb' -require_relative './models/sdk_internal_event.rb' module SplitIoClient module Engine @@ -23,8 +21,8 @@ def ready! @sdk_ready.count_down @config.logger.info('SplitIO SDK is ready') @internal_events_queue.push( - SdkInternalEventNotification.new( - SdkInternalEvent::SDK_READY, nil + SplitIoClient::Engine::Models::SdkInternalEventNotification.new( + SplitIoClient::Engine::Models::SdkInternalEvent::SDK_READY, nil ) ) end From 8b2ccbba8f01a9629b3ef6892c36b403a54853c9 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 11 Mar 2026 13:19:55 -0700 Subject: [PATCH 5/7] polish --- .../engine/events/events_manager.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/splitclient-rb/engine/events/events_manager.rb b/lib/splitclient-rb/engine/events/events_manager.rb index 10273c75..3cefd4f6 100644 --- a/lib/splitclient-rb/engine/events/events_manager.rb +++ b/lib/splitclient-rb/engine/events/events_manager.rb @@ -18,15 +18,15 @@ def register(sdk_event, event_handler) @mutex.synchronize do # SDK ready already fired - if sdk_event == SplitIoClient::Engine::Models::SdkEvent::SDK_READY && event_already_triggered(sdk_event) - @active_subscriptions[sdk_event] = SplitIoClient::Engine::Models::EventActiveSubscriptions.new(true, event_handler) + if sdk_event == Engine::Models::SdkEvent::SDK_READY && event_already_triggered(sdk_event) + @active_subscriptions[sdk_event] = Engine::Models::EventActiveSubscriptions.new(true, event_handler) @config.logger.debug('EventsManager: Firing SDK_READY event for new subscription') if @config.debug_enabled fire_sdk_event(sdk_event, nil) return end @config.logger.debug("EventsManager: Register event: #{sdk_event}") if @config.debug_enabled - @active_subscriptions[sdk_event] = SplitIoClient::Engine::Models::EventActiveSubscriptions.new(false, event_handler) + @active_subscriptions[sdk_event] = Engine::Models::EventActiveSubscriptions.new(false, event_handler) end end @@ -50,7 +50,7 @@ def notify_internal_event(sdk_internal_event, event_metadata) # if client is not subscribed to SDK_READY if check_if_register_needed(sorted_event) @config.logger.debug('EventsManager: Registering SDK_READY event as fired') if @config.debug_enabled - @active_subscriptions[SplitIoClient::Engine::Models::SdkEvent::SDK_READY] = SplitIoClient::Engine::Models::EventActiveSubscriptions.new(true, nil) + @active_subscriptions[Engine::Models::SdkEvent::SDK_READY] = Engine::Models::EventActiveSubscriptions.new(true, nil) end end end @@ -66,7 +66,7 @@ def destroy private def check_if_register_needed(sorted_event) - sorted_event == SplitIoClient::Engine::Models::SdkEvent::SDK_READY && + sorted_event == Engine::Models::SdkEvent::SDK_READY && get_event_handler(sorted_event).nil? && !@active_subscriptions.include?(sorted_event) end @@ -110,7 +110,7 @@ def get_event_handler(sdk_event) end def get_sdk_event_if_applicable(sdk_internal_event) - final_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(nil, false) + final_sdk_event = Engine::Models::ValidSdkEvent.new(nil, false) events_to_fire = [] require_any_sdk_event = check_require_any(sdk_internal_event) @@ -118,7 +118,7 @@ def get_sdk_event_if_applicable(sdk_internal_event) if (!event_already_triggered(require_any_sdk_event.sdk_event) && execution_limit(require_any_sdk_event.sdk_event) == 1) || execution_limit(require_any_sdk_event.sdk_event) == -1 - final_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new( + final_sdk_event = Engine::Models::ValidSdkEvent.new( require_any_sdk_event.sdk_event, check_prerequisites(require_any_sdk_event.sdk_event) && check_suppressed_by(require_any_sdk_event.sdk_event) @@ -178,10 +178,10 @@ def execution_limit(sdk_event) end def check_require_any(sdk_internal_event) - valid_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(nil, false) + valid_sdk_event = Engine::Models::ValidSdkEvent.new(nil, false) @manager_config.require_any.each do |name, val| if val.include?(sdk_internal_event) - valid_sdk_event = SplitIoClient::Engine::Models::ValidSdkEvent.new(name, true) + valid_sdk_event = Engine::Models::ValidSdkEvent.new(name, true) return valid_sdk_event end end From df3f78eafb66561c6e44a14964659bfb36bdb314 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 11 Mar 2026 14:22:40 -0700 Subject: [PATCH 6/7] polish --- .../engine/events/events_manager.rb | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/splitclient-rb/engine/events/events_manager.rb b/lib/splitclient-rb/engine/events/events_manager.rb index 3cefd4f6..363a755e 100644 --- a/lib/splitclient-rb/engine/events/events_manager.rb +++ b/lib/splitclient-rb/engine/events/events_manager.rb @@ -4,6 +4,8 @@ module SplitIoClient module Engine module Events class EventsManager + include SplitIoClient::Engine::Models + def initialize(events_manager_config, events_delivery, config) @manager_config = events_manager_config @events_delivery = events_delivery @@ -18,15 +20,15 @@ def register(sdk_event, event_handler) @mutex.synchronize do # SDK ready already fired - if sdk_event == Engine::Models::SdkEvent::SDK_READY && event_already_triggered(sdk_event) - @active_subscriptions[sdk_event] = Engine::Models::EventActiveSubscriptions.new(true, event_handler) + if sdk_event == SdkEvent::SDK_READY && event_already_triggered(sdk_event) + @active_subscriptions[sdk_event] = EventActiveSubscriptions.new(true, event_handler) @config.logger.debug('EventsManager: Firing SDK_READY event for new subscription') if @config.debug_enabled fire_sdk_event(sdk_event, nil) return end @config.logger.debug("EventsManager: Register event: #{sdk_event}") if @config.debug_enabled - @active_subscriptions[sdk_event] = Engine::Models::EventActiveSubscriptions.new(false, event_handler) + @active_subscriptions[sdk_event] = EventActiveSubscriptions.new(false, event_handler) end end @@ -50,7 +52,7 @@ def notify_internal_event(sdk_internal_event, event_metadata) # if client is not subscribed to SDK_READY if check_if_register_needed(sorted_event) @config.logger.debug('EventsManager: Registering SDK_READY event as fired') if @config.debug_enabled - @active_subscriptions[Engine::Models::SdkEvent::SDK_READY] = Engine::Models::EventActiveSubscriptions.new(true, nil) + @active_subscriptions[SdkEvent::SDK_READY] = EventActiveSubscriptions.new(true, nil) end end end @@ -66,7 +68,7 @@ def destroy private def check_if_register_needed(sorted_event) - sorted_event == Engine::Models::SdkEvent::SDK_READY && + sorted_event == SdkEvent::SDK_READY && get_event_handler(sorted_event).nil? && !@active_subscriptions.include?(sorted_event) end @@ -110,7 +112,7 @@ def get_event_handler(sdk_event) end def get_sdk_event_if_applicable(sdk_internal_event) - final_sdk_event = Engine::Models::ValidSdkEvent.new(nil, false) + final_sdk_event = ValidSdkEvent.new(nil, false) events_to_fire = [] require_any_sdk_event = check_require_any(sdk_internal_event) @@ -118,7 +120,7 @@ def get_sdk_event_if_applicable(sdk_internal_event) if (!event_already_triggered(require_any_sdk_event.sdk_event) && execution_limit(require_any_sdk_event.sdk_event) == 1) || execution_limit(require_any_sdk_event.sdk_event) == -1 - final_sdk_event = Engine::Models::ValidSdkEvent.new( + final_sdk_event = ValidSdkEvent.new( require_any_sdk_event.sdk_event, check_prerequisites(require_any_sdk_event.sdk_event) && check_suppressed_by(require_any_sdk_event.sdk_event) @@ -178,10 +180,10 @@ def execution_limit(sdk_event) end def check_require_any(sdk_internal_event) - valid_sdk_event = Engine::Models::ValidSdkEvent.new(nil, false) + valid_sdk_event = ValidSdkEvent.new(nil, false) @manager_config.require_any.each do |name, val| if val.include?(sdk_internal_event) - valid_sdk_event = Engine::Models::ValidSdkEvent.new(name, true) + valid_sdk_event = ValidSdkEvent.new(name, true) return valid_sdk_event end end From 40fc8f03003ce4c3c4c90131dc1688c4f4e6a96b Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 11 Mar 2026 14:54:22 -0700 Subject: [PATCH 7/7] rolled back include in events manager --- .../engine/events/events_manager.rb | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/lib/splitclient-rb/engine/events/events_manager.rb b/lib/splitclient-rb/engine/events/events_manager.rb index 363a755e..3cefd4f6 100644 --- a/lib/splitclient-rb/engine/events/events_manager.rb +++ b/lib/splitclient-rb/engine/events/events_manager.rb @@ -4,8 +4,6 @@ module SplitIoClient module Engine module Events class EventsManager - include SplitIoClient::Engine::Models - def initialize(events_manager_config, events_delivery, config) @manager_config = events_manager_config @events_delivery = events_delivery @@ -20,15 +18,15 @@ def register(sdk_event, event_handler) @mutex.synchronize do # SDK ready already fired - if sdk_event == SdkEvent::SDK_READY && event_already_triggered(sdk_event) - @active_subscriptions[sdk_event] = EventActiveSubscriptions.new(true, event_handler) + if sdk_event == Engine::Models::SdkEvent::SDK_READY && event_already_triggered(sdk_event) + @active_subscriptions[sdk_event] = Engine::Models::EventActiveSubscriptions.new(true, event_handler) @config.logger.debug('EventsManager: Firing SDK_READY event for new subscription') if @config.debug_enabled fire_sdk_event(sdk_event, nil) return end @config.logger.debug("EventsManager: Register event: #{sdk_event}") if @config.debug_enabled - @active_subscriptions[sdk_event] = EventActiveSubscriptions.new(false, event_handler) + @active_subscriptions[sdk_event] = Engine::Models::EventActiveSubscriptions.new(false, event_handler) end end @@ -52,7 +50,7 @@ def notify_internal_event(sdk_internal_event, event_metadata) # if client is not subscribed to SDK_READY if check_if_register_needed(sorted_event) @config.logger.debug('EventsManager: Registering SDK_READY event as fired') if @config.debug_enabled - @active_subscriptions[SdkEvent::SDK_READY] = EventActiveSubscriptions.new(true, nil) + @active_subscriptions[Engine::Models::SdkEvent::SDK_READY] = Engine::Models::EventActiveSubscriptions.new(true, nil) end end end @@ -68,7 +66,7 @@ def destroy private def check_if_register_needed(sorted_event) - sorted_event == SdkEvent::SDK_READY && + sorted_event == Engine::Models::SdkEvent::SDK_READY && get_event_handler(sorted_event).nil? && !@active_subscriptions.include?(sorted_event) end @@ -112,7 +110,7 @@ def get_event_handler(sdk_event) end def get_sdk_event_if_applicable(sdk_internal_event) - final_sdk_event = ValidSdkEvent.new(nil, false) + final_sdk_event = Engine::Models::ValidSdkEvent.new(nil, false) events_to_fire = [] require_any_sdk_event = check_require_any(sdk_internal_event) @@ -120,7 +118,7 @@ def get_sdk_event_if_applicable(sdk_internal_event) if (!event_already_triggered(require_any_sdk_event.sdk_event) && execution_limit(require_any_sdk_event.sdk_event) == 1) || execution_limit(require_any_sdk_event.sdk_event) == -1 - final_sdk_event = ValidSdkEvent.new( + final_sdk_event = Engine::Models::ValidSdkEvent.new( require_any_sdk_event.sdk_event, check_prerequisites(require_any_sdk_event.sdk_event) && check_suppressed_by(require_any_sdk_event.sdk_event) @@ -180,10 +178,10 @@ def execution_limit(sdk_event) end def check_require_any(sdk_internal_event) - valid_sdk_event = ValidSdkEvent.new(nil, false) + valid_sdk_event = Engine::Models::ValidSdkEvent.new(nil, false) @manager_config.require_any.each do |name, val| if val.include?(sdk_internal_event) - valid_sdk_event = ValidSdkEvent.new(name, true) + valid_sdk_event = Engine::Models::ValidSdkEvent.new(name, true) return valid_sdk_event end end