class WebsocketRails::Channel

Attributes

name[R]
subscribers[R]

Public Class Methods

new(channel_name) click to toggle source
# File lib/websocket_rails/channel.rb, line 10
def initialize(channel_name)
  @subscribers = []
  @name        = channel_name
  @private     = false
end

Public Instance Methods

filter_with(controller, catch_all=nil) click to toggle source
# File lib/websocket_rails/channel.rb, line 53
def filter_with(controller, catch_all=nil)
  filtered_channels[@name] = catch_all.nil? ? controller : [controller, catch_all]
end
is_private?() click to toggle source
# File lib/websocket_rails/channel.rb, line 57
def is_private?
  @private
end
make_private() click to toggle source
# File lib/websocket_rails/channel.rb, line 46
def make_private
  unless config.keep_subscribers_when_private?
    @subscribers.clear
  end
  @private = true
end
subscribe(connection) click to toggle source
# File lib/websocket_rails/channel.rb, line 16
def subscribe(connection)
  info "#{connection} subscribed to channel #{@name}"
  trigger 'subscriber_join', connection.user if config.broadcast_subscriber_events?
  @subscribers << connection
  send_token connection
end
token() click to toggle source
# File lib/websocket_rails/channel.rb, line 61
def token
  @token ||= channel_tokens[@name] ||= generate_unique_token
end
trigger(event_name,data={},options={}) click to toggle source
# File lib/websocket_rails/channel.rb, line 30
def trigger(event_name,data={},options={})
  options.merge! :channel => @name, :token => token
  options[:data] = data

  event = Event.new event_name, options

  info "[#{@name}] #{event.data.inspect}"
  send_data event
end
trigger_event(event) click to toggle source
# File lib/websocket_rails/channel.rb, line 40
def trigger_event(event)
  return if event.token != token
  info "[#{@name}] #{event.data.inspect}"
  send_data event
end
unsubscribe(connection) click to toggle source
# File lib/websocket_rails/channel.rb, line 23
def unsubscribe(connection)
  return unless @subscribers.include? connection
  info "#{connection} unsubscribed from channel #{@name}"
  @subscribers.delete connection
  trigger 'subscriber_part', connection.user if config.broadcast_subscriber_events?
end

Private Instance Methods

generate_unique_token() click to toggle source
# File lib/websocket_rails/channel.rb, line 67
def generate_unique_token
  begin
    new_token = SecureRandom.uuid
  end while channel_tokens.values.include?(new_token)

  new_token
end
send_data(event) click to toggle source
# File lib/websocket_rails/channel.rb, line 85
def send_data(event)
  return unless event.should_propagate?
  if WebsocketRails.synchronize? && event.server_token.nil?
    Synchronization.publish event
  end

  @subscribers.each do |subscriber|
    subscriber.trigger event
  end
end
send_token(connection) click to toggle source
# File lib/websocket_rails/channel.rb, line 75
def send_token(connection)
  options = {
    :channel => @name,
    :data => {:token => token},
    :connection => connection
  }
  info 'sending token'
  Event.new('websocket_rails.channel_token', options).trigger
end