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