class A4Tools::WebSocketTransporter

Attributes

ready[R]

Public Class Methods

new(uri) click to toggle source
Calls superclass method A4Tools::Transporter::new
# File lib/acres_client.rb, line 85
def initialize(uri)
  super()
  @uri = uri
  @queue = []
  @ready = false
  @mutex = Mutex.new
  @condition = ConditionVariable.new
end

Public Instance Methods

connect(timeout=5) click to toggle source
# File lib/acres_client.rb, line 94
def connect(timeout=5)
  return true if @ready
  start_socket
  @mutex.synchronize { @condition.wait(@mutex, timeout) }
  @ready
end
disconnect() click to toggle source
# File lib/acres_client.rb, line 101
def disconnect
  @client.kill unless @client.nil?
  @client = nil
  @ws = nil
  true
end
empty_queue() click to toggle source
# File lib/acres_client.rb, line 140
def empty_queue
  @queue.each { |msg| send_message(msg) }
  @queue = []
end
send_message(msg) click to toggle source
# File lib/acres_client.rb, line 145
def send_message(msg)
  unless @ready then
    @queue.push msg
    return
  end

  signal(:sent, msg)
  @ws.send(msg)
end
start_socket() click to toggle source
# File lib/acres_client.rb, line 108
def start_socket
  @client = Thread.new do
    EM.run do
      @ws = Faye::WebSocket::Client.new(@uri.to_s)

      @ws.on :open do |event|
        @mutex.synchronize do
          @ready = true
          @condition.signal
        end
        
        signal(:connect)
        empty_queue
      end

      @ws.on :error do |event|
        @mutex.synchronize { @condition.signal }
      end

      @ws.on :message do |event|
        signal(:message, event.data)
      end

      @ws.on :close do |event|
        @ready = false
        @ws = nil
        signal(:disconnect)
      end
    end
  end
end