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