class TellaPeer::Connection

Attributes

last_read[RW]
last_sent[RW]
start_time[RW]
text[RW]

Public Class Methods

new(socket, remote_ip, remote_port, direction) click to toggle source
Calls superclass method
# File lib/tella_peer/connection.rb, line 7
def initialize(socket, remote_ip, remote_port, direction)
  super(socket, remote_ip, remote_port, direction)
  socket.binmode
end

Public Instance Methods

close_socket() click to toggle source
# File lib/tella_peer/connection.rb, line 30
def close_socket
  socket.close unless socket.closed?
  Connections.close_connection(key)
end
inspect() click to toggle source
# File lib/tella_peer/connection.rb, line 119
def inspect
  {
    remote_ip: remote_ip, 
    remote_port: remote_port,
    time_elapsed: time_elapsed,
    text: text,
    direction: direction,
  }.inspect
end
key() click to toggle source
# File lib/tella_peer/connection.rb, line 35
def key
  "#{remote_ip}:#{remote_port}"
end
logger() click to toggle source
# File lib/tella_peer/connection.rb, line 111
def logger
  TellaPeer.logger
end
no_op(message) click to toggle source
# File lib/tella_peer/connection.rb, line 129
def no_op(message)
  logger.debug "Remove #{message.class} #{message.message_id} from network" if message
end
read_message(message) click to toggle source
# File lib/tella_peer/connection.rb, line 92
def read_message(message)
  Connections.count_message(message.type, :in) if message
  logger.debug "Read #{message.class} #{message.message_id}" if message
  if message.kind_of?    TellaPeer::Ping
    read_ping  message
  elsif message.kind_of? TellaPeer::Pong
    read_pong  message
  elsif message.kind_of? TellaPeer::Query
    read_query message
  elsif message.kind_of? TellaPeer::Reply
    read_reply message
  elsif message.nil?
    # Blank message probably a read error
  else
    logger.warn 'Unknown message: #{message}'
  end
  self.last_read = message 
end
read_ping(message) click to toggle source
# File lib/tella_peer/connection.rb, line 55
def read_ping(message)
  if Connections.seen_ping?(message.message_id, from: self)
    no_op(message)
  else
    send_message(message.build_reply)
    Connections.flood(message.increment!, except_to: self)
  end
end
read_pong(message) click to toggle source
# File lib/tella_peer/connection.rb, line 64
def read_pong(message)
  Connections.add_potential_connection(message.pretty_ip, message.port)
  if connection = Connections.seen_ping?(message.message_id)
    connection.send_message(message)
  else
    no_op(message)
  end
end
read_query(message) click to toggle source
# File lib/tella_peer/connection.rb, line 73
def read_query(message)
  if Connections.seen_query?(message.message_id, from: self)
    no_op(message)
  else
    send_message(message.build_reply)
    Connections.flood(message.increment!, except_to: self)
  end
end
read_reply(message) click to toggle source
# File lib/tella_peer/connection.rb, line 82
def read_reply(message)
  Connections.add_potential_connection(message.pretty_ip, message.port)
  Connections.store_reply(message)
  if connection = Connections.seen_query?(message.message_id)
    connection.send_message(message)
  else
    no_op(message)
  end
end
send_message(message, increment: false) click to toggle source
# File lib/tella_peer/connection.rb, line 39
def send_message(message, increment: false)
  to ||= socket
  begin
    message.increment! if increment
    if message.transmitable?
      to.write(message.pack) 
      Connections.count_message(message.type, :out)
      self.last_sent = message
    end
  rescue
    logger.debug "Write to #{key} failed -- #{$!.message}"
    logger.debug $!.backtrace
    close_socket
  end
end
time_elapsed() click to toggle source
# File lib/tella_peer/connection.rb, line 115
def time_elapsed
  Time.now - start_time
end
watch() click to toggle source
# File lib/tella_peer/connection.rb, line 12
def watch
  Thread.new do
    self.start_time = Time.now

    begin
      until socket.closed? do
        message = TellaPeer::Message.unpack(socket, remote_ip, remote_port)
        read_message(message)
      end
    rescue
      logger.debug $!
    ensure
      close_socket
      logger.info "Closed connection to #{key}"
    end
  end
end