class Pytty::Daemon::Api::WebSockets

Public Class Methods

new(env) click to toggle source
# File lib/pytty/daemon/api/web_sockets.rb, line 8
def initialize(env)
  @env = env

  @connection = Async::WebSocket::Server.open(env)
  @@connections << @connection

  @messages = Async::Queue.new
  @writes = Async::Queue.new
end

Public Instance Methods

close() click to toggle source
# File lib/pytty/daemon/api/web_sockets.rb, line 18
def close
  @@connections.each do |connection|
    connection.close
  end
  @@connections = []
end
handle() click to toggle source
# File lib/pytty/daemon/api/web_sockets.rb, line 33
def handle
  Async::Task.current.async do
    while message = @connection.next_event
      type = case message
      when WebSocket::Driver::OpenEvent
        puts "ws: open #{@env["REMOTE_ADDR"]}"
      when WebSocket::Driver::CloseEvent
        puts "ws: close #{@env["REMOTE_ADDR"]}"
        @@connections.delete @connection
      when WebSocket::Driver::MessageEvent
        puts "ws: message #{@env["REMOTE_ADDR"]}"
        @messages.enqueue message.data
      else
        raise "ws: unknown #{message.inspect}"
      end
    end
  end

  Async::Task.current.async do |task|
    while message = @writes.dequeue
      @@connections.each do |connection|
        connection.send_message(message)
      rescue Exception => ex
        #TODO
      end
    end
  end
end
read() click to toggle source
# File lib/pytty/daemon/api/web_sockets.rb, line 25
def read
  @messages.dequeue
end
write(message) click to toggle source
# File lib/pytty/daemon/api/web_sockets.rb, line 29
def write(message)
  @writes.enqueue message
end