module Thrift::EventMachineConnection

Constants

GARBAGE_BUFFER_SIZE

Public Class Methods

connect(host='localhost', port=9090, timeout=5, &block) click to toggle source
# File lib/thrift_client/event_machine.rb, line 52
def self.connect(host='localhost', port=9090, timeout=5, &block)
  EM.connect(host, port, self, host, port) do |conn|
    conn.pending_connect_timeout = timeout
  end
end
new(host, port=9090) click to toggle source
# File lib/thrift_client/event_machine.rb, line 67
def initialize(host, port=9090)
  @host, @port = host, port
  @index = 0
  @disconnected = 'not connected'
  @buf = ''
end

Public Instance Methods

blocking_read(size) click to toggle source
# File lib/thrift_client/event_machine.rb, line 81
def blocking_read(size)
  raise IOError, "lost connection to #{@host}:#{@port}: #{@disconnected}" if @disconnected
  if can_read?(size)
    yank(size)
  else
    raise ArgumentError, "Unexpected state" if @size or @callback

    fiber = Fiber.current
    @size = size
    @callback = proc { |data|
      fiber.resume(data)
    }
    Fiber.yield
  end
end
can_read?(size) click to toggle source
# File lib/thrift_client/event_machine.rb, line 127
def can_read?(size)
  @buf.size >= @index + size
end
close() click to toggle source
# File lib/thrift_client/event_machine.rb, line 74
def close
  trap do
    @disconnected = 'closed'
    close_connection(true)
  end
end
connected?() click to toggle source
# File lib/thrift_client/event_machine.rb, line 110
def connected?
  !@disconnected
end
connection_completed() click to toggle source
# File lib/thrift_client/event_machine.rb, line 114
def connection_completed
  @disconnected = nil
  succeed
end
receive_data(data) click to toggle source
# File lib/thrift_client/event_machine.rb, line 97
def receive_data(data)
  trap do
    (@buf) << data

    if @callback and can_read?(@size)
      callback = @callback
      data = yank(@size)
      @callback = @size = nil
      callback.call(data)
    end
  end
end
trap() { || ... } click to toggle source
# File lib/thrift_client/event_machine.rb, line 58
def trap
  begin
    yield
  rescue Exception => ex
    puts ex.message
    puts ex.backtrace.join("\n")
  end
end
unbind() click to toggle source
# File lib/thrift_client/event_machine.rb, line 119
def unbind
  if !@disconnected
    @disconnected = 'unbound'
  else
    fail
  end
end

Private Instance Methods

yank(len) click to toggle source
# File lib/thrift_client/event_machine.rb, line 133
def yank(len)      
  data = @buf.slice(@index, len)
  @index += len
  @index = @buf.size if @index > @buf.size
  if @index >= GARBAGE_BUFFER_SIZE
    @buf = @buf.slice(@index..-1)
    @index = 0
  end
  data
end