Class: ChannelTasks

Inherits:
Object show all
Defined in:
app/volt/tasks/channel_tasks.rb

Constant Summary collapse

@@listeners =
{}
@@channel_listeners =
{}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(channel, dispatcher = nil) ⇒ ChannelTasks

The dispatcher passes its self in



6
7
8
# File 'app/volt/tasks/channel_tasks.rb', line 6

def initialize(channel, dispatcher=nil)
  @channel = channel
end

Class Method Details

.send_message_to_channel(channel_name, message, skip_channel = nil) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'app/volt/tasks/channel_tasks.rb', line 42

def self.send_message_to_channel(channel_name, message, skip_channel=nil)
  listeners = @@listeners[channel_name]
  
  if listeners
    listeners.each do |listener|
      # We might need to skip a channel if the update came in on this
      # channel.
      next if listener == skip_channel
      
      listener.send_message(*message)
    end
  end
end

Instance Method Details

#add_listener(channel_name, scope = {}) ⇒ Object



10
11
12
13
14
15
16
17
18
19
# File 'app/volt/tasks/channel_tasks.rb', line 10

def add_listener(channel_name, scope={})
  # Track every channel that is listening
  @@listeners[channel_name] ||= []
  @@listeners[channel_name] << @channel
  
  # Also keep track of which channel names a channel is listening
  # on so it can be removed if a channel is closed.
  @@channel_listeners[@channel] ||= {}
  @@channel_listeners[@channel][channel_name] = true
end

#close!Object

Called when a channel is closed, removes its listeners from all channels.



32
33
34
35
36
37
38
39
40
# File 'app/volt/tasks/channel_tasks.rb', line 32

def close!
  channel_names = @@channel_listeners.delete(@channel)
  
  if channel_names
    channel_names.each_pair do |channel_name,val|
      remove_listener(channel_name)
    end
  end
end

#remove_listener(channel_name, scope = {}) ⇒ Object



21
22
23
24
25
26
27
28
# File 'app/volt/tasks/channel_tasks.rb', line 21

def remove_listener(channel_name, scope={})
  if @@listeners[channel_name]
    @@listeners[channel_name].delete(@channel)
    if @@channel_listeners[@channel]
      @@channel_listeners[@channel].delete(channel_name)
    end
  end
end