Sha256: 34233d7bd5f1b5ca10e2b6fb769d9cad729476d5b1ba3b93ea36835a2efe5189

Contents?: true

Size: 1.38 KB

Versions: 4

Compression:

Stored size: 1.38 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 print(arg)
      socket.print dump_object(arg)
    rescue SystemCallError => error
      reconnect
      retry
    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
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
specjour-0.2.3 lib/specjour/connection.rb
specjour-0.2.2 lib/specjour/connection.rb
specjour-0.2.1 lib/specjour/connection.rb
specjour-0.2.0 lib/specjour/connection.rb