class ActionChannels::Server

Attributes

channel_repository[R]
port[R]

Public Class Methods

new(options) click to toggle source
# File lib/action_channels/server.rb, line 5
def initialize(options)
  @port = options.fetch(:port)
  @channel_repository = ChannelRepository.new options.fetch(:channels, [])
end

Public Instance Methods

process_client(client) click to toggle source
# File lib/action_channels/server.rb, line 18
def process_client(client)
  client.on :message, callback_on_message(client)
  client.on :close, callback_on_close(client)
  client.on :error, callback_on_error(client)
  client.on :io_error, callback_on_io_error(client)

  client
end
run() click to toggle source
# File lib/action_channels/server.rb, line 10
def run
  NIO::WebSocket.listen port: port do |driver|
    process_client Driver.new(driver)
  end

  ActionChannels.logger.info "Server started on port: #{port}"
end

Private Instance Methods

callback_on_close(client) click to toggle source
# File lib/action_channels/server.rb, line 61
def callback_on_close(client)
  lambda do |event|
    ActionChannels.logger.info "Client closed connection."
    channel_repository.all.each { |channel| channel.remove_client(client) }
  end
end
callback_on_error(client) click to toggle source
# File lib/action_channels/server.rb, line 54
def callback_on_error(client)
  lambda do |event|
    ActionChannels.logger.error "Received error: #{event.message}"
    channel_repository.all.each { |channel| channel.remove_client(client) }
  end
end
callback_on_io_error(client) click to toggle source
# File lib/action_channels/server.rb, line 47
def callback_on_io_error(client)
  proc do
    ActionChannels.logger.error "Received io_error."
    channel_repository.all.each { |channel| channel.remove_client(client) }
  end
end
callback_on_message(client) click to toggle source
# File lib/action_channels/server.rb, line 29
def callback_on_message(client)
  lambda do |event|
    begin
      ActionChannels.logger.info "Received new message: #{event.data}"

      message = Message.parse_and_setup_author event.data, client
      process_message message
    rescue Errors::NotParseMessage => exp
      ActionChannels.logger.error exp.message
      message_sender.send_error_400 client
    end
  end
end
message_sender() click to toggle source
# File lib/action_channels/server.rb, line 43
def message_sender
  @message_sender ||= MessageSenders::WebSocket.new
end
process_message(message) click to toggle source
# File lib/action_channels/server.rb, line 68
def process_message(message)
  channel = channel_repository.find_by_name_or_create message.channel
  channel.process_message message
end