class RedisClient::RubyConnection

Experimental RBS support (using type sampling data from the type_fusion project).

# sig/redis_client/ruby_connection.rbs

class RedisClient::RubyConnection
  def read: (?nil timeout) -> untyped
end

def close

def close
  @io.close
  super
end

def connect

def connect
  socket = if @config.path
    UNIXSocket.new(@config.path)
  else
    sock = if SUPPORTS_RESOLV_TIMEOUT
      Socket.tcp(@config.host, @config.port, connect_timeout: @connect_timeout, resolv_timeout: @connect_timeout)
    else
      Socket.tcp(@config.host, @config.port, connect_timeout: @connect_timeout)
    end
    # disables Nagle's Algorithm, prevents multiple round trips with MULTI
    sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
    enable_socket_keep_alive(sock)
    sock
  end
  if @config.ssl
    socket = OpenSSL::SSL::SSLSocket.new(socket, @config.ssl_context)
    socket.hostname = @config.host
    loop do
      case status = socket.connect_nonblock(exception: false)
      when :wait_readable
        socket.to_io.wait_readable(@connect_timeout) or raise CannotConnectError
      when :wait_writable
        socket.to_io.wait_writable(@connect_timeout) or raise CannotConnectError
      when socket
        break
      else
        raise "Unexpected `connect_nonblock` return: #{status.inspect}"
      end
    end
  end
  @io = BufferedIO.new(
    socket,
    read_timeout: @read_timeout,
    write_timeout: @write_timeout,
  )
  true
rescue SystemCallError, OpenSSL::SSL::SSLError, SocketError => error
  raise CannotConnectError, error.message, error.backtrace
end

def connected?

def connected?
  !@io.closed?
end

def enable_socket_keep_alive(socket)

Linux
def enable_socket_keep_alive(socket)
  socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
  socket.setsockopt(Socket::SOL_TCP, Socket::TCP_KEEPIDLE, KEEP_ALIVE_INTERVAL)
  socket.setsockopt(Socket::SOL_TCP, Socket::TCP_KEEPINTVL, KEEP_ALIVE_INTERVAL)
  socket.setsockopt(Socket::SOL_TCP, Socket::TCP_KEEPCNT, KEEP_ALIVE_PROBES)
end

def enable_socket_keep_alive(socket)

macOS
def enable_socket_keep_alive(socket)
  socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
  socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPINTVL, KEEP_ALIVE_INTERVAL)
  socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPCNT, KEEP_ALIVE_PROBES)
end

def enable_socket_keep_alive(socket)

unknown POSIX
def enable_socket_keep_alive(socket)
  socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
end

def enable_socket_keep_alive(_socket)

unknown
def enable_socket_keep_alive(_socket)
end

def initialize(config, connect_timeout:, read_timeout:, write_timeout:)

def initialize(config, connect_timeout:, read_timeout:, write_timeout:)
  super()
  @config = config
  @connect_timeout = connect_timeout
  @read_timeout = read_timeout
  @write_timeout = write_timeout
  connect
end

def read(timeout = nil)

Experimental RBS support (using type sampling data from the type_fusion project).

def read: (?nil timeout) -> untyped

This signature was generated using 1 sample from 1 application.

def read(timeout = nil)
  if timeout.nil?
    RESP3.load(@io)
  else
    @io.with_timeout(timeout) { RESP3.load(@io) }
  end
rescue RedisClient::RESP3::UnknownType => error
  raise RedisClient::ProtocolError, error.message
rescue SystemCallError, IOError, OpenSSL::SSL::SSLError => error
  raise ConnectionError, error.message
end

def read_timeout=(timeout)

def read_timeout=(timeout)
  @read_timeout = timeout
  @io.read_timeout = timeout if @io
end

def ssl_context(ssl_params)

def ssl_context(ssl_params)
  params = ssl_params.dup || {}
  cert = params[:cert]
  if cert.is_a?(String)
    cert = File.read(cert) if File.exist?(cert)
    params[:cert] = OpenSSL::X509::Certificate.new(cert)
  end
  key = params[:key]
  if key.is_a?(String)
    key = File.read(key) if File.exist?(key)
    params[:key] = OpenSSL::PKey.read(key)
  end
  context = OpenSSL::SSL::SSLContext.new
  context.set_params(params)
  if context.verify_mode != OpenSSL::SSL::VERIFY_NONE
    if context.respond_to?(:verify_hostname) # Missing on JRuby
      context.verify_hostname
    end
  end
  context
end

def write(command)

def write(command)
  buffer = RESP3.dump(command)
  begin
    @io.write(buffer)
  rescue SystemCallError, IOError => error
    raise ConnectionError, error.message
  end
end

def write_multi(commands)

def write_multi(commands)
  buffer = nil
  commands.each do |command|
    buffer = RESP3.dump(command, buffer)
  end
  begin
    @io.write(buffer)
  rescue SystemCallError, IOError => error
    raise ConnectionError, error.message
  end
end

def write_timeout=(timeout)

def write_timeout=(timeout)
  @write_timeout = timeout
  @io.write_timeout = timeout if @io
end