Adding initial util.pubsub
authorMatthew Wild <mwild1@gmail.com>
Sat, 28 Feb 2009 23:16:27 +0000 (23:16 +0000)
committerMatthew Wild <mwild1@gmail.com>
Sat, 28 Feb 2009 23:16:27 +0000 (23:16 +0000)
util/pubsub.lua [new file with mode: 0644]

diff --git a/util/pubsub.lua b/util/pubsub.lua
new file mode 100644 (file)
index 0000000..c1e35e3
--- /dev/null
@@ -0,0 +1,60 @@
+
+local ipairs, pairs, setmetatable, type = 
+        ipairs, pairs, setmetatable, type;
+
+module "pubsub"
+
+local pubsub_node_mt = { __index = _M };
+
+function new_node(name)
+       return setmetatable({ name = name, subscribers = {} }, pubsub_node_mt);
+end
+
+function set_subscribers(node, subscribers_list, list_type)
+       local subscribers = node.subscribers;
+       
+       if list_type == "array" then
+               for _, jid in ipairs(subscribers_list) do
+                       if not subscribers[jid] then
+                               node:add_subscriber(jid);
+                       end
+               end
+       elseif (not list_type) or list_type == "set" then
+               for jid in pairs(subscribers_list) do
+                       if type(jid) == "string" then
+                               node:add_subscriber(jid);
+                       end
+               end
+       end
+end
+
+function get_subscribers(node)
+       return node.subscribers;
+end
+
+function publish(node, item, dispatcher, data)
+       local subscribers = node.subscribers;
+       for i = 1,#subscribers do
+               item.attr.to = subscribers[i];
+               dispatcher(data, item);
+       end
+end
+
+function add_subscriber(node, jid)
+       local subscribers = node.subscribers;
+       if not subscribers[jid] then
+               local space = #subscribers;
+               subscribers[space] = jid;
+               subscribers[jid] = space;
+       end
+end
+
+function remove_subscriber(node, subscriber)
+       local subscribers = node.subscribers;
+       if subscribers[jid] then
+               subscribers[subscribers[jid]] = nil;
+               subscribers[jid] = nil;
+       end
+end
+
+return _M;