From b0429b926a3ae3af7de14d98818807c510708c86 Mon Sep 17 00:00:00 2001 From: Mike Blumtritt Date: Thu, 2 May 2024 11:36:15 +0200 Subject: [PATCH] It's time for v1.0.0 - select wait method dynamically --- lib/tcp-client/ssl_socket.rb | 4 +- lib/tcp-client/tcp_socket.rb | 4 +- lib/tcp-client/version.rb | 2 +- .../io_with_deadline.rb => with_deadline.rb} | 43 ++++++++++--------- 4 files changed, 27 insertions(+), 26 deletions(-) rename lib/tcp-client/{mixin/io_with_deadline.rb => with_deadline.rb} (75%) diff --git a/lib/tcp-client/ssl_socket.rb b/lib/tcp-client/ssl_socket.rb index 11209bc..08a8d5b 100644 --- a/lib/tcp-client/ssl_socket.rb +++ b/lib/tcp-client/ssl_socket.rb @@ -7,11 +7,11 @@ end require_relative 'deadline' -require_relative 'mixin/io_with_deadline' +require_relative 'with_deadline' class TCPClient class SSLSocket < ::OpenSSL::SSL::SSLSocket - include IOWithDeadlineMixin + include WithDeadline def initialize(socket, address, configuration, deadline, exception) ssl_params = Hash[configuration.ssl_params] diff --git a/lib/tcp-client/tcp_socket.rb b/lib/tcp-client/tcp_socket.rb index d0a0f9d..1f3b287 100644 --- a/lib/tcp-client/tcp_socket.rb +++ b/lib/tcp-client/tcp_socket.rb @@ -2,11 +2,11 @@ require 'socket' require_relative 'deadline' -require_relative 'mixin/io_with_deadline' +require_relative 'with_deadline' class TCPClient class TCPSocket < ::Socket - include IOWithDeadlineMixin + include WithDeadline def initialize(address, configuration, deadline, exception) super(address.addrinfo.ipv6? ? :INET6 : :INET, :STREAM) diff --git a/lib/tcp-client/version.rb b/lib/tcp-client/version.rb index 99a7e16..0bc074a 100644 --- a/lib/tcp-client/version.rb +++ b/lib/tcp-client/version.rb @@ -2,5 +2,5 @@ class TCPClient # The current version number. - VERSION = '0.14.0' + VERSION = '1.0.0' end diff --git a/lib/tcp-client/mixin/io_with_deadline.rb b/lib/tcp-client/with_deadline.rb similarity index 75% rename from lib/tcp-client/mixin/io_with_deadline.rb rename to lib/tcp-client/with_deadline.rb index 3c32466..6e801d6 100644 --- a/lib/tcp-client/mixin/io_with_deadline.rb +++ b/lib/tcp-client/with_deadline.rb @@ -1,16 +1,7 @@ # frozen_string_literal: true class TCPClient - module IOWithDeadlineMixin - class << self - private - - def included(mod) - return if defined?(mod.wait_writable) && defined?(mod.wait_readable) - mod.include(defined?(mod.to_io) ? WaitWithIO : WaitWithSelect) - end - end - + module WithDeadline def read_with_deadline(nbytes, deadline, exception) raise(exception) unless deadline.remaining_time return fetch_avail(deadline, exception) if nbytes.nil? @@ -79,10 +70,10 @@ def with_deadline(deadline, exception) case ret = yield when :wait_writable remaining_time = deadline.remaining_time or raise(exception) - wait_writable(remaining_time) or raise(exception) + wait_write[remaining_time] or raise(exception) when :wait_readable remaining_time = deadline.remaining_time or raise(exception) - wait_readable(remaining_time) or raise(exception) + wait_read[remaining_time] or raise(exception) else return ret end @@ -91,18 +82,28 @@ def with_deadline(deadline, exception) raise(exception) end - module WaitWithIO - def wait_writable(time) = to_io.wait_writable(time) - def wait_readable(time) = to_io.wait_readable(time) + def wait_write + @wait_write ||= + if defined?(wait_writable) + ->(t) { wait_writable(t) } + elsif defined?(to_io) + ->(t) { to_io.wait_writable(t) } + else + ->(t) { ::IO.select(nil, [self], nil, t) } + end end - module WaitWithSelect - def wait_writable(time) = ::IO.select(nil, [self], nil, time) - def wait_readable(time) = ::IO.select([self], nil, nil, time) + def wait_read + @wait_read ||= + if defined?(wait_readable) + ->(t) { wait_readable(t) } + elsif defined?(to_io) + ->(t) { to_io.wait_readable(t) } + else + ->(t) { ::IO.select([self], nil, nil, t) } + end end - - private_constant(:WaitWithIO, :WaitWithSelect) end - private_constant(:IOWithDeadlineMixin) + private_constant(:WithDeadline) end