Friday, September 20, 2024 2:34:34 AM
> settings

Customize


Authenticate

> server.rb
# 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
All opinions represented herein are my own
- © 2024 itsthedevman
- build 340fbb8