Sha256: b6bbc88d71391fd070e3cff4c4976d4bb939995cf1e98bd2935a3ef1ea18f607

Contents?: true

Size: 1.95 KB

Versions: 1

Compression:

Stored size: 1.95 KB

Contents

require 'transports'
require 'socket'

module Servicy
  # This is a transport that is almost an exact duplicate of the UNIXSocket
  # transport, but can actually go over the wire. That whole, "Everything is a
  # file" business works out well...
  class TCPTransport < Servicy::Transport
    HELLO = "Servicy says HI!"

    def send(message)
      Servicy.logger.debug("Connecting")
      socket = TCPSocket.new host, port
      hello = socket.gets
      raise "Not a servicy server" unless hello.strip == HELLO
      Servicy.logger.debug("Sending #{message.body}")
      socket.puts message.body
      response = socket.gets
      Servicy.logger.debug("Received #{response}")
      message = Message.new(response)
      socket.close
      message
    end

    def start(&block)
      @server = TCPServer.open(port)

      loop do
        Thread.start(@server.accept) do |client|
          client.puts HELLO
          message = Message.new client.gets
          Servicy.logger.debug("Got #{message.body}")
          result = block.call(message)
          Servicy.logger.debug("Replying #{result.body}")
          client.puts result.body
          client.close
          Servicy.logger.debug("Closed connection")
        end
      end
    end
    alias_method :start_api, :start

    def stop
      @server && @server.close
    end

    # This makes a request as an actual API consumer over the wire, and returns
    # the results.
    def remote_request(name, args)
      args = format(args)
      response = send(Message.api(name, args))
      if response.struct['error']
        raise response.error
      else
        results = unformat(response.result)
      end
    end

    private

    def host
      host = Servicy.config.client.host
      host = host.nil? ? 'localhost' : host
      @config[:host] || host
    end

    def port
      config_port = Servicy.config.transport.port
      config_port = config_port.nil? ? 1234 : config_port
      @config[:port] || config_port
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
servicy-0.0.6 lib/transport/tcp_transport.rb