class ActionChannels::Channels::Base

Attributes

clients[R]
message_sender[RW]
name[R]

Public Class Methods

new(attrs) click to toggle source
# File lib/action_channels/channels/base.rb, line 7
def initialize(attrs)
  @name = attrs.fetch(:name)
  @clients = Set.new
  @message_sender = attrs.fetch :message_sender, MessageSenders::WebSocket.new
end

Public Instance Methods

add_client(client) click to toggle source
# File lib/action_channels/channels/base.rb, line 17
def add_client(client)
  clients << client

  ActionChannels.logger.info "The channel ##{self.name} added a client"
  ActionChannels.logger.debug "Count of client of channel ##{self.name} is #{self.clients.count}."
end
after_message_subscribe(subscriber, details) click to toggle source
# File lib/action_channels/channels/base.rb, line 61
def after_message_subscribe(subscriber, details)
  # nothing
end
after_message_unsubscribe(subscriber, details) click to toggle source
# File lib/action_channels/channels/base.rb, line 65
def after_message_unsubscribe(subscriber, details)
  # nothing
end
notify_all(message) click to toggle source
# File lib/action_channels/channels/base.rb, line 31
def notify_all(message)
  clients.each do |client|
    send_message client, message
  end
end
process_custom_message(message) click to toggle source
# File lib/action_channels/channels/base.rb, line 57
def process_custom_message(message)
  # nothing
end
process_message(message) click to toggle source
# File lib/action_channels/channels/base.rb, line 37
def process_message(message)
  ActionChannels.logger.debug "The channel ##{self.name} received a message #{message.inspect}"

  if message.systemic?
    process_system_message message
  else
    process_custom_message message
  end
end
process_system_message(message) click to toggle source
# File lib/action_channels/channels/base.rb, line 47
def process_system_message(message)
  case message.type
  when 'subscribe'
    on_subscribe message.author, message.details
  when 'unsubscribe'
    on_unsubscribe message.author, message.details
  else
  end
end
remove_client(client) click to toggle source
# File lib/action_channels/channels/base.rb, line 24
def remove_client(client)
  clients.delete client

  ActionChannels.logger.info "The channel ##{self.name} removed a client"
  ActionChannels.logger.debug "Count of client of channel ##{self.name} is #{self.clients.count}."
end
send_message(receiver, message) click to toggle source
# File lib/action_channels/channels/base.rb, line 13
def send_message(receiver, message)
  message_sender.do_send(receiver, message)
end

Private Instance Methods

on_subscribe(subscriber, details) click to toggle source
# File lib/action_channels/channels/base.rb, line 71
def on_subscribe(subscriber, details)
  add_client(subscriber)
  send_message subscriber, Message.new(channel: name, type: 'subscribed')
  after_message_subscribe subscriber, details
end
on_unknown_type_message(message) click to toggle source
# File lib/action_channels/channels/base.rb, line 83
def on_unknown_type_message(message)
  user, type = message.author, message.type
  send_message user, Message.new(channel: name, type: 'invalid_message', details: { error: "Unknown type of message: #{type}" })
end
on_unsubscribe(subscriber, details) click to toggle source
# File lib/action_channels/channels/base.rb, line 77
def on_unsubscribe(subscriber, details)
  remove_client(subscriber)
  send_message subscriber, Message.new(channel: name, type: 'unsubscribed')
  after_message_unsubscribe subscriber, details
end