Method: Undead::WebSocketServer#receive

Defined in:
lib/undead/web_socket_server.rb

#receive(cmd_id, receive_timeout = nil) ⇒ Object

Block until the next message is available from the Web Socket. Raises Errno::EWOULDBLOCK if timeout is reached.



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/undead/web_socket_server.rb', line 72

def receive(cmd_id, receive_timeout=nil)
  receive_timeout ||= timeout
  start = Time.now

  until @messages.has_key?(cmd_id)
    raise Errno::EWOULDBLOCK if (Time.now - start) >= receive_timeout
    if @receive_mutex.try_lock
      begin
        IO.select([socket], [], [], receive_timeout) or raise Errno::EWOULDBLOCK
        data = socket.recv(RECV_SIZE)
        break if data.empty?
        driver.parse(data)
      ensure
        @receive_mutex.unlock
      end
    else
      sleep(0.05)
    end
  end
  @messages.delete(cmd_id)
end