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