Sha256: 9bc119192916e73d27111d3020db35541a93ecf103f957b240fce88440039b86

Contents?: true

Size: 1.6 KB

Versions: 5

Compression:

Stored size: 1.6 KB

Contents

module Specjour
  class Connection
    include Protocol
    extend Forwardable

    attr_reader :uri
    attr_writer :socket

    def_delegators :socket, :flush, :closed?, :gets, :each

    def self.wrap(established_connection)
      host, port = established_connection.peeraddr.values_at(3,1)
      connection = new URI::Generic.build(:host => host, :port => port)
      connection.socket = established_connection
      connection
    end

    def initialize(uri)
      @uri = uri
    end

    alias to_str to_s

    def connect
      timeout { connect_socket }
    end

    def disconnect
      socket.close
    end

    def socket
      @socket ||= connect
    end

    def timeout(&block)
      Timeout.timeout(2, &block)
    rescue Timeout::Error
      raise Error, "Connection to dispatcher timed out"
    end

    def next_test
      will_reconnect do
        send_message(:ready)
        load_object socket.gets(TERMINATOR)
      end
    end

    def print(arg)
      will_reconnect do
        socket.print dump_object(arg)
      end
    end

    def puts(arg)
      print(arg << "\n")
    end

    def send_message(method_name, *args)
      print([method_name, *args])
      flush
    end

    protected

    def connect_socket
      @socket = TCPSocket.open(uri.host, uri.port)
    rescue Errno::ECONNREFUSED => error
      Specjour.logger.debug "Could not connect to #{uri.to_s}\n#{error.inspect}"
      retry
    end

    def reconnect
      socket.close unless socket.closed?
      connect
    end

    def will_reconnect(&block)
      block.call
    rescue SystemCallError => error
      reconnect
      retry
    end
  end
end

Version data entries

5 entries across 5 versions & 3 rubygems

Version Path
relex-specjour-0.2.7 lib/specjour/connection.rb
JonathanTron-specjour-0.2.5.1 lib/specjour/connection.rb
relex-specjour-0.2.6 lib/specjour/connection.rb
specjour-0.2.5 lib/specjour/connection.rb
specjour-0.2.4 lib/specjour/connection.rb