From 514e6e07be9bfcea9758019d01daf1730e52e1c3 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 9 Oct 2025 21:11:41 -0700 Subject: [PATCH 1/3] replace socketry with socket for sse client --- lib/splitclient-rb/sse/event_source/client.rb | 41 +++++++++++++++---- lib/splitclient-rb/version.rb | 2 +- splitclient-rb.gemspec | 1 - 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 022894d6..7d63ad74 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -1,7 +1,9 @@ # frozen_string_literal: false -require 'socketry' +require 'socket' +require 'openssl' require 'uri' +require 'timeout' module SplitIoClient module SSE @@ -41,7 +43,7 @@ def close(status = nil) end @connected.make_false - @socket&.close + @socket.close push_status(status) rescue StandardError => e @config.logger.error("SSEClient close Error: #{e.inspect}") @@ -83,14 +85,24 @@ def connect_thread(latch) def connect_stream(latch) return Constants::PUSH_NONRETRYABLE_ERROR unless socket_write(latch) - while connected? || @first_event.value begin - partial_data = @socket.readpartial(10_000, timeout: @read_timeout) - + partial_data = "" + Timeout::timeout @read_timeout do + partial_data = @socket.readpartial(10_000) + end read_first_event(partial_data, latch) raise 'eof exception' if partial_data == :eof + rescue Timeout::Error => e + @config.logger.error("SSE read operation timed out!: #{e.inspect}") if @config.debug_enabled + return nil + rescue EOFError + break + rescue Errno::EAGAIN => e + @config.logger.debug("SSE client transient error: #{e.inspect}") if @config.debug_enabled + IO.select([tcp_socket]) + retry rescue Errno::EBADF, IOError => e @config.logger.error(e.inspect) if @config.debug_enabled return nil @@ -109,7 +121,7 @@ def connect_stream(latch) def socket_write(latch) @first_event.make_true @socket = socket_connect - @socket.write(build_request(@uri)) + @socket.puts(build_request(@uri)) true rescue StandardError => e @config.logger.error("Error during connecting to #{@uri.host}. Error: #{e.inspect}") @@ -138,9 +150,22 @@ def read_first_event(data, latch) end def socket_connect - return Socketry::SSL::Socket.connect(@uri.host, @uri.port) if @uri.scheme.casecmp('https').zero? + tcp_socket = TCPSocket.new(@uri.host, @uri.port) + if @uri.scheme.casecmp('https').zero? + begin + ssl_context = OpenSSL::SSL::SSLContext.new + ssl_socket = OpenSSL::SSL::SSLSocket.new(tcp_socket, ssl_context) + ssl_socket.hostname = @uri.host + ssl_socket.connect + return ssl_socket.connect + rescue Exception => e + @config.logger.error("socket connect error: #{e.inspect}") + puts e.inspect + return nil + end + end - Socketry::TCP::Socket.connect(@uri.host, @uri.port) + tcp_socket end def process_data(partial_data) diff --git a/lib/splitclient-rb/version.rb b/lib/splitclient-rb/version.rb index 1afbdd0a..e7470b9c 100644 --- a/lib/splitclient-rb/version.rb +++ b/lib/splitclient-rb/version.rb @@ -1,3 +1,3 @@ module SplitIoClient - VERSION = '8.9.0' + VERSION = '8.10.0-rc1' end diff --git a/splitclient-rb.gemspec b/splitclient-rb.gemspec index 3c818df9..742c6d3f 100644 --- a/splitclient-rb.gemspec +++ b/splitclient-rb.gemspec @@ -59,6 +59,5 @@ Gem::Specification.new do |spec| spec.add_runtime_dependency 'lru_redux', '~> 1.1' spec.add_runtime_dependency 'net-http-persistent', '>= 2.9', '< 5.0' spec.add_runtime_dependency 'redis', '>= 4.0.0', '< 6.0' - spec.add_runtime_dependency 'socketry', '>= 0.4', '< 1.0' spec.add_runtime_dependency 'thread_safe', '~> 0.3' end From af9f0c0ae45fe9e2d104f880f668a986cbb7256d Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 9 Oct 2025 21:38:22 -0700 Subject: [PATCH 2/3] polish --- lib/splitclient-rb/sse/event_source/client.rb | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 7d63ad74..3d914e6a 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -38,7 +38,7 @@ def initialize(config, def close(status = nil) unless connected? - @config.logger.error('SSEClient already disconected.') if @config.debug_enabled + log_if_debug('SSEClient already disconected.', 3) return end @@ -76,10 +76,10 @@ def connected? def connect_thread(latch) @config.threads[:connect_stream] = Thread.new do - @config.logger.info('Starting connect_stream thread ...') if @config.debug_enabled + log_if_debug('Starting connect_stream thread ...', 2) new_status = connect_stream(latch) push_status(new_status) - @config.logger.info('connect_stream thread finished.') if @config.debug_enabled + log_if_debug('connect_stream thread finished.', 2) end end @@ -95,21 +95,21 @@ def connect_stream(latch) raise 'eof exception' if partial_data == :eof rescue Timeout::Error => e - @config.logger.error("SSE read operation timed out!: #{e.inspect}") if @config.debug_enabled + log_if_debug("SSE read operation timed out!: #{e.inspect}", 3) return nil rescue EOFError break rescue Errno::EAGAIN => e - @config.logger.debug("SSE client transient error: #{e.inspect}") if @config.debug_enabled + log_if_debug("SSE client transient error: #{e.inspect}", 1) IO.select([tcp_socket]) retry rescue Errno::EBADF, IOError => e - @config.logger.error(e.inspect) if @config.debug_enabled + log_if_debug(e.inspect, 3) return nil rescue StandardError => e return nil if ENV['SPLITCLIENT_ENV'] == 'test' - @config.logger.error("Error reading partial data: #{e.inspect}") if @config.debug_enabled + log_if_debug("Error reading partial data: #{e.inspect}", 3) return Constants::PUSH_RETRYABLE_ERROR end @@ -124,7 +124,7 @@ def socket_write(latch) @socket.puts(build_request(@uri)) true rescue StandardError => e - @config.logger.error("Error during connecting to #{@uri.host}. Error: #{e.inspect}") + log_if_debug("Error during connecting to #{@uri.host}. Error: #{e.inspect}", 3) latch.count_down false end @@ -171,7 +171,7 @@ def socket_connect def process_data(partial_data) return if partial_data.nil? || partial_data == KEEP_ALIVE_RESPONSE - @config.logger.debug("Event partial data: #{partial_data}") if @config.debug_enabled + log_if_debug("Event partial data: #{partial_data}", 1) events = @event_parser.parse(partial_data) events.each { |event| process_event(event) } rescue StandardError => e @@ -187,7 +187,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}") if @config.debug_enabled + log_if_debug("Request info: #{req}", 1) req end @@ -225,6 +225,19 @@ def push_status(status) @config.logger.debug("Pushing new sse status: #{status}") @status_queue.push(status) end + + def log_if_debug(text, level) + if @config.debug_enabled + case level + when 1 + @config.logger.debug(text) + when 2 + @config.logger.info(text) + when 3 + @config.logger.error(text) + end + end + end end end end From fe4c0ff4910a364cb6f5f1cece45d59508d473b0 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Fri, 10 Oct 2025 10:11:33 -0700 Subject: [PATCH 3/3] polish --- lib/splitclient-rb/sse/event_source/client.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 3d914e6a..b58406fb 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -96,9 +96,9 @@ def connect_stream(latch) raise 'eof exception' if partial_data == :eof rescue Timeout::Error => e log_if_debug("SSE read operation timed out!: #{e.inspect}", 3) - return nil + return Constants::PUSH_RETRYABLE_ERROR rescue EOFError - break + raise 'eof exception' rescue Errno::EAGAIN => e log_if_debug("SSE client transient error: #{e.inspect}", 1) IO.select([tcp_socket]) @@ -233,7 +233,7 @@ def log_if_debug(text, level) @config.logger.debug(text) when 2 @config.logger.info(text) - when 3 + else @config.logger.error(text) end end