dc3f3432f4ace195db2a500925c35c5249c81237
[prosody.git] / util / pubsub.lua
1 module("pubsub", package.seeall);
2
3 local service = {};
4 local service_mt = { __index = service };
5
6 function new(cb)
7         return setmetatable({ cb = cb or {}, nodes = {} }, service_mt);
8 end
9
10 function service:add_subscription(node, actor, jid)
11         local node_obj = self.nodes[node];
12         if not node_obj then
13                 return false, "item-not-found";
14         end
15         node_obj.subscribers[jid] = true;
16         return true;
17 end
18
19 function service:remove_subscription(node, actor, jid)
20         self.nodes[node].subscribers[jid] = nil;
21         return true;
22 end
23
24 function service:get_subscription(node, actor, jid)
25         local node_obj = self.nodes[node];
26         if node_obj then
27                 return node_obj.subscribers[jid];
28         end
29 end
30
31 function service:create(node, actor)
32         if not self.nodes[node] then
33                 self.nodes[node] = { name = node, subscribers = {}, config = {}, data = {} };
34                 return true;
35         end
36         return false, "conflict";
37 end
38
39 function service:publish(node, actor, id, item)
40         local node_obj = self.nodes[node];
41         if not node_obj then
42                 node_obj = { name = node, subscribers = {}, config = {}, data = {} };
43                 self.nodes[node] = node_obj;
44         end
45         node_obj.data[id] = item;
46         self.cb.broadcaster(node, node_obj.subscribers, item);
47         return true;
48 end
49
50 function service:get(node, actor, id)
51         local node_obj = self.nodes[node];
52         if node_obj then
53                 if id then
54                         return { node_obj.data[id] };
55                 else
56                         return node_obj.data;
57                 end
58         end
59 end
60
61 return _M;