class SleepRoom::Record::WebSocket

Attributes

queue[RW]

Public Class Methods

new(room:, broadcast_key:, url:) click to toggle source
# File lib/sleeproom/record/websocket.rb, line 10
def initialize(room:, broadcast_key:, url:)
  @room = room
  @url = "wss://" + url
  @broadcast_key = broadcast_key
  @running = false
  @queue = Async::Queue.new
end

Public Instance Methods

connect(task: Async::Task.current) { |parse(split("\t")[2])| ... } click to toggle source
# File lib/sleeproom/record/websocket.rb, line 18
def connect(task: Async::Task.current)
  url = @url
  endpoint = Async::HTTP::Endpoint.parse(url)
    Async::WebSocket::Client.connect(endpoint, handler: WebSocketConnection) do |connection|
      @connection = connection
      @running = true
      connection.write("SUB\t#{@broadcast_key}")
      connection.flush
      log("Connect to websocket server.")
      @queue.enqueue({event: :connect, time: Time.now})
      
      ping_task = task.async do |sub|
        while @running
          sub.sleep 60
          @queue.enqueue({event: :ping, time: Time.now})
          connection.write("PING\tshowroom")
          connection.flush
        end
      end

      status_task = task.async do |sub|
        while true
          sub.sleep 1
          if @running == false
            connection.close
          end
        end
      end

      while message = connection.read
        if message == "ACK\tshowroom"
          @queue.enqueue({event: :ack, time: Time.now}) if message == "ACK\tshowroom"
        end
        if message.start_with?("MSG")
          begin
            yield JSON.parse(message.split("\t")[2])
          rescue => e
            SleepRoom.error(e.message)
          end
        end
      end
    rescue => e
      SleepRoom.error(e.message)
    ensure
      ping_task&.stop
      connection.close
      log("WebSocket closed.")
    end
end
log(str) click to toggle source
# File lib/sleeproom/record/websocket.rb, line 81
def log(str)
  SleepRoom.info("[#{@room}] #{str}")
end
running=(bool) click to toggle source
# File lib/sleeproom/record/websocket.rb, line 72
def running=(bool)
  @running = bool
end
running?() click to toggle source
# File lib/sleeproom/record/websocket.rb, line 68
def running?
  @running
end
stop() click to toggle source
# File lib/sleeproom/record/websocket.rb, line 76
def stop
  @running = false
  @connection.close
end