class Vines::Config::PubSub
Provides the configuration DSL to conf/config.rb for pubsub subdomains and exposes the storage and notification systems that the pubsub stanzas need to process. This class hides the complexity of determining pubsub behavior in a standalone vs. clustered chat server environment from the stanzas.
Public Class Methods
new(config, name)
click to toggle source
# File lib/vines/config/pubsub.rb, line 10 def initialize(config, name) @config, @name = config, name @nodes = {} end
Public Instance Methods
add_node(id)
click to toggle source
# File lib/vines/config/pubsub.rb, line 15 def add_node(id) if @config.cluster? @config.cluster.add_pubsub_node(@name, id) else @nodes[id] ||= Set.new end end
delete_node(id)
click to toggle source
# File lib/vines/config/pubsub.rb, line 23 def delete_node(id) if @config.cluster? @config.cluster.delete_pubsub_node(@name, id) else @nodes.delete(id) end end
node?(node)
click to toggle source
# File lib/vines/config/pubsub.rb, line 60 def node?(node) if @config.cluster? @config.cluster.pubsub_node?(@name, node) else @nodes.key?(node) end end
publish(node, stanza)
click to toggle source
# File lib/vines/config/pubsub.rb, line 77 def publish(node, stanza) stanza['id'] = Kit.uuid stanza['from'] = @name local, remote = subscribers(node).partition {|jid| @config.local_jid?(jid) } local.flat_map do |jid| @config.router.connected_resources(jid, @name) end.each do |recipient| stanza['to'] = recipient.user.jid.to_s recipient.write(stanza) end remote.each do |jid| el = stanza.clone el['to'] = jid.to_s @config.router.route(el) rescue nil # ignore RemoteServerNotFound end end
subscribe(node, jid)
click to toggle source
# File lib/vines/config/pubsub.rb, line 31 def subscribe(node, jid) return unless node?(node) && @config.allowed?(jid, @name) if @config.cluster? @config.cluster.subscribe_pubsub(@name, node, jid) else @nodes[node] << JID.new(jid) end end
subscribed?(node, jid)
click to toggle source
# File lib/vines/config/pubsub.rb, line 68 def subscribed?(node, jid) return false unless node?(node) if @config.cluster? @config.cluster.pubsub_subscribed?(@name, node, jid) else @nodes[node].include?(JID.new(jid)) end end
unsubscribe(node, jid)
click to toggle source
# File lib/vines/config/pubsub.rb, line 40 def unsubscribe(node, jid) return unless node?(node) if @config.cluster? @config.cluster.unsubscribe_pubsub(@name, node, jid) else @nodes[node].delete(JID.new(jid)) delete_node(node) if subscribers(node).empty? end end
unsubscribe_all(jid)
click to toggle source
# File lib/vines/config/pubsub.rb, line 50 def unsubscribe_all(jid) if @config.cluster? @config.cluster.unsubscribe_all_pubsub(@name, jid) else @nodes.keys.each do |node| unsubscribe(node, jid) end end end
Private Instance Methods
subscribers(node)
click to toggle source
# File lib/vines/config/pubsub.rb, line 99 def subscribers(node) if @config.cluster? @config.cluster.pubsub_subscribers(@name, node) else @nodes[node] || [] end end