class Volt::MessageBus::PeerServer

Public Class Methods

new(message_bus) click to toggle source
# File lib/volt/server/message_bus/peer_to_peer/peer_server.rb, line 11
def initialize(message_bus)
  @message_bus = message_bus

  setup_port_ranges

  ip = Volt.config.message_bus.try(:bind_ip)
  begin
    @server = TCPServer.new(random_port!)
  rescue Errno::EADDRINUSE => e
    # Keep trying ports until we find one that is not in use, or the pool
    # runs out of ports.
    retry
  end

  run_server
end

Public Instance Methods

port() click to toggle source
# File lib/volt/server/message_bus/peer_to_peer/peer_server.rb, line 46
def port
  @server.addr[1]
end
run_server() click to toggle source
# File lib/volt/server/message_bus/peer_to_peer/peer_server.rb, line 28
def run_server
  @main_thread = Thread.new do
    # Start the server
    loop do
      Thread.start(@server.accept) do |socket|
        peer_connection = PeerConnection.new(socket, nil, nil,
          @message_bus, true)

        @message_bus.add_peer_connection(peer_connection)
      end
    end
  end
end
stop() click to toggle source
# File lib/volt/server/message_bus/peer_to_peer/peer_server.rb, line 42
def stop
  @main_thread.kill
end

Private Instance Methods

random_port!() click to toggle source
# File lib/volt/server/message_bus/peer_to_peer/peer_server.rb, line 63
def random_port!
  port = @ports_pool.sample

  unless port
    # no available ports left
    raise NoAvailablePortException, 'no ports available in Volt.config.message_bus.bind_port_ranges'
  end

  # remove from the pool
  @ports_pool.delete(port)

  port
end
setup_port_ranges() click to toggle source
# File lib/volt/server/message_bus/peer_to_peer/peer_server.rb, line 51
def setup_port_ranges
  port_ranges = Volt.config.message_bus.try(:bind_port_ranges)

  if port_ranges
    # Expand any ranges, then sample one from the array
    @ports_pool = port_ranges.to_a.map {|v| v.is_a?(Range) ? v.to_a : v }.flatten
  else
    # port 0, which tells TCPServer to select any random port.
    @ports_pool = [0]
  end
end