class Pakyow::Realtime::WebSocket

Constants

Frame

Attributes

id[R]

Public Class Methods

new(id, connection) click to toggle source
# File lib/pakyow/realtime/websocket.rb, line 43
def initialize(id, connection)
  @id, @connection, @open = id, connection, false
  @logger = Logger.new(:sock, id: @id[0..7], output: Pakyow.global_logger, level: Pakyow.config.logger.level)
  @server = @connection.app.websocket_server

  response = Async::WebSocket::Adapters::Native.open(@connection.request, handler: Connection) do |socket|
    @socket = socket

    handle_open
    while message = socket.read
      handle_message(message)
    end
  rescue EOFError, Protocol::WebSocket::ClosedError
  ensure
    @socket&.close; shutdown
  end

  @connection.__getobj__.instance_variable_set(:@response, response)
end

Public Instance Methods

beat() click to toggle source
# File lib/pakyow/realtime/websocket.rb, line 79
def beat
  transmit("beat")
end
leave() click to toggle source

@api private

# File lib/pakyow/realtime/websocket.rb, line 92
def leave
  trigger_presence(:leave)
end
open?() click to toggle source
# File lib/pakyow/realtime/websocket.rb, line 63
def open?
  @open == true
end
shutdown() click to toggle source
# File lib/pakyow/realtime/websocket.rb, line 83
def shutdown
  if open?
    @server.socket_disconnect(self)
    @open = false
    @logger.info "shutdown"
  end
end
transmit(message, raw: false) click to toggle source
# File lib/pakyow/realtime/websocket.rb, line 67
def transmit(message, raw: false)
  if open?
    if raw
      @socket.write(message)
    else
      @socket.write(JSON.dump(payload: message))
    end

    @socket.flush
  end
end

Private Instance Methods

handle_message(message) click to toggle source
# File lib/pakyow/realtime/websocket.rb, line 106
def handle_message(message)
  @logger.internal {
    "< " + message
  }
end
handle_open() click to toggle source
# File lib/pakyow/realtime/websocket.rb, line 98
def handle_open
  @server.socket_connect(self)
  @open = true
  trigger_presence(:join)
  @logger.info "opened"
  transmit_system_info
end
transmit_system_info() click to toggle source
# File lib/pakyow/realtime/websocket.rb, line 118
def transmit_system_info
  transmit({
    channel: "system",
    message: {
      version: @connection.app.config.version
    }
  })
end
trigger_presence(event) click to toggle source
# File lib/pakyow/realtime/websocket.rb, line 112
def trigger_presence(event)
  @connection.app.hooks(:before, event).each do |hook, _|
    instance_exec(&hook[:block])
  end
end