module IOWithDeadlineMixin

Public Class Methods

included(mod) click to toggle source
# File lib/tcp-client/mixin/io_with_deadline.rb, line 4
def self.included(mod)
  methods = mod.instance_methods
  if methods.index(:wait_writable) && methods.index(:wait_readable)
    mod.include(ViaWaitMethod)
  else
    mod.include(ViaSelect)
  end
end

Public Instance Methods

read_with_deadline(bytes_to_read, deadline, exception) click to toggle source
# File lib/tcp-client/mixin/io_with_deadline.rb, line 13
def read_with_deadline(bytes_to_read, deadline, exception)
  raise(exception) unless deadline.remaining_time
  result = ''.b
  while result.bytesize < bytes_to_read
    read =
      with_deadline(deadline, exception) do
        read_nonblock(bytes_to_read - result.bytesize, exception: false)
      end
    next result += read if read
    close
    break
  end
  result
end
write_with_deadline(data, deadline, exception) click to toggle source
# File lib/tcp-client/mixin/io_with_deadline.rb, line 28
def write_with_deadline(data, deadline, exception)
  raise(exception) unless deadline.remaining_time
  return 0 if (size = data.bytesize).zero?
  result = 0
  loop do
    written =
      with_deadline(deadline, exception) do
        write_nonblock(data, exception: false)
      end
    result += written
    return result if result >= size
    data = data.byteslice(written, data.bytesize - written)
  end
end