app/volt/tasks/channel_tasks.rb in volt-0.4.7 vs app/volt/tasks/channel_tasks.rb in volt-0.4.8

- old
+ new

@@ -1,24 +1,46 @@ class ChannelTasks @@listeners = {} + @@channel_listeners = {} - def initialize(channel, dispatcher) + # The dispatcher passes its self in + def initialize(channel, dispatcher=nil) @channel = channel - @dispatcher = dispatcher end def add_listener(channel_name) + # 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 def remove_listener(channel_name) if @@listeners[channel_name] @@listeners[channel_name].delete(@channel) + if @@channel_listeners[@channel] + @@channel_listeners[@channel].delete(channel_name) + end end end - def self.send_message_to_channel(channel_name, message, skip_channel) + # Called when a channel is closed, removes its listeners from + # all channels. + 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 + + 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 \ No newline at end of file