class Nonnative::SocketPair

Attributes

proxy[R]

Public Class Methods

new(proxy) click to toggle source
# File lib/nonnative/socket_pair.rb, line 5
def initialize(proxy)
  @proxy = proxy
end

Public Instance Methods

connect(local_socket) click to toggle source
# File lib/nonnative/socket_pair.rb, line 9
def connect(local_socket)
  remote_socket = create_remote_socket

  loop do
    ready = select([local_socket, remote_socket], nil, nil)

    break if pipe(ready, local_socket, remote_socket)
    break if pipe(ready, remote_socket, local_socket)
  end
ensure
  local_socket.close
  remote_socket&.close
end

Protected Instance Methods

create_remote_socket() click to toggle source
# File lib/nonnative/socket_pair.rb, line 27
def create_remote_socket
  ::TCPSocket.new('0.0.0.0', proxy.port)
end
pipe(ready, socket1, socket2) click to toggle source
# File lib/nonnative/socket_pair.rb, line 31
def pipe(ready, socket1, socket2)
  if ready[0].include?(socket1)
    data = read(socket1)
    return true if data.empty?

    write socket2, data
  end

  false
end
read(socket) click to toggle source
# File lib/nonnative/socket_pair.rb, line 42
def read(socket)
  socket.recv(1024)
end
write(socket, data) click to toggle source
# File lib/nonnative/socket_pair.rb, line 46
def write(socket, data)
  socket.write(data)
end