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 |