# frozen_string_literal: true
module ESM
class Websocket
class Server
def self.run
# Load Faye support for puma
Faye::WebSocket.load_adapter("puma")
port = ESM.config.ports.websocket
@server = Puma::Server.new(self)
@server.add_tcp_listener("0.0.0.0", port)
@server.run
info!("Starting server")
@overseer = ESM::Websocket::Connection::Overseer.new
end
def self.call(env)
return if !Faye::WebSocket.websocket?(env)
# Create a new websocket client
ws = Faye::WebSocket.new(env)
# To avoid over loading everything
@overseer.add_to_lobby(ws)
# Return async Rack response
ws.rack_response
end
def self.log(*args)
ESM.logger.info("#{self.class}##{__method__}") { "Websocket server is running on #{args.first}" }
end
def self.stop
# Trigger a fake on_close event to notify communities that the connection lost is because ESM is rebooting.
# EventMachine will cause a Ruby SegFault if all connections are closed in a loop.
ESM::Websocket.connections&.each { |_server_id, connection| connection.send(:on_close, nil) }
ESM::Websocket::Request::Overseer.die
@server&.stop
end
end
end
end