Sha256: c2162506d6df8486484adb6a754813588d443e3a4c686aa407aaf68855f966f3

Contents?: true

Size: 1.73 KB

Versions: 10

Compression:

Stored size: 1.73 KB

Contents

require 'timeout'
require 'lucid/wire_support/wire_protocol'

module Lucid
  module WireSupport
    class Connection
      class ConnectionError < StandardError; end

      include WireProtocol

      def initialize(config)
        @config = config
      end

      def call_remote(request_handler, message, params)
        packet = WirePacket.new(message, params)

        begin
          send_data_to_socket(packet.to_json)
          response = fetch_data_from_socket(@config.timeout(message))
          response.handle_with(request_handler)
        rescue Timeout::Error => e
          backtrace = e.backtrace ; backtrace.shift # because Timeout puts some wierd stuff in there
          raise Timeout::Error, "Timed out calling wire server with message '#{message}'", backtrace
        end
      end

      def exception(params)
        WireException.new(params, @config)
      end

      private

      def send_data_to_socket(data)
        Timeout.timeout(@config.timeout('connect')) { socket.puts(data) }
      end

      def fetch_data_from_socket(timeout)
        raw_response =
          if timeout == :never
            socket.gets
          else
            Timeout.timeout(timeout) { socket.gets }
          end
        raise exception({'message' => "Remote Socket with #{@config.host}:#{@config.port} closed."}) if raw_response.nil?
        WirePacket.parse(raw_response)
      end

      def socket
        return @socket if @socket
        if @config.unix
          @socket = UNIXSocket.new(@config.unix)
        else
          @socket = TCPSocket.new(@config.host, @config.port)
        end
      rescue Errno::ECONNREFUSED => exception
        raise(ConnectionError, "Unable to contact the wire server at #{@config}. Is it up?")
      end
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
lucid-0.3.0 lib/lucid/wire_support/connection.rb
lucid-0.2.1 lib/lucid/wire_support/connection.rb
lucid-0.2.0 lib/lucid/wire_support/connection.rb
lucid-0.1.1 lib/lucid/wire_support/connection.rb
lucid-0.1.0 lib/lucid/wire_support/connection.rb
lucid-0.0.9 lib/lucid/wire_support/connection.rb
lucid-0.0.8 lib/lucid/wire_support/connection.rb
lucid-0.0.7 lib/lucid/wire_support/connection.rb
lucid-0.0.6 lib/lucid/wire_support/connection.rb
lucid-0.0.5 lib/lucid/wire_support/connection.rb