Mercurial > prosody-hg
comparison util/pubsub.lua @ 6442:0f4025abbe8f
Merge 0.10->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 28 Sep 2014 01:56:22 +0200 |
| parents | 905b4fd863b4 d58ad8bd244b |
| children | ecd8d6437053 |
comparison
equal
deleted
inserted
replaced
| 6432:388786af0dd2 | 6442:0f4025abbe8f |
|---|---|
| 4 module("pubsub", package.seeall); | 4 module("pubsub", package.seeall); |
| 5 | 5 |
| 6 local service = {}; | 6 local service = {}; |
| 7 local service_mt = { __index = service }; | 7 local service_mt = { __index = service }; |
| 8 | 8 |
| 9 local default_config = { | 9 local default_config = { __index = { |
| 10 broadcaster = function () end; | 10 broadcaster = function () end; |
| 11 get_affiliation = function () end; | 11 get_affiliation = function () end; |
| 12 capabilities = {}; | 12 capabilities = {}; |
| 13 }; | 13 } }; |
| 14 local default_node_config = { __index = { | |
| 15 ["pubsub#max_items"] = "20"; | |
| 16 } }; | |
| 14 | 17 |
| 15 function new(config) | 18 function new(config) |
| 16 config = config or {}; | 19 config = config or {}; |
| 17 return setmetatable({ | 20 return setmetatable({ |
| 18 config = setmetatable(config, { __index = default_config }); | 21 config = setmetatable(config, default_config); |
| 22 node_defaults = setmetatable(config.node_defaults or {}, default_node_config); | |
| 19 affiliations = {}; | 23 affiliations = {}; |
| 20 subscriptions = {}; | 24 subscriptions = {}; |
| 21 nodes = {}; | 25 nodes = {}; |
| 22 data = {}; | 26 data = {}; |
| 23 events = events.new(); | 27 events = events.new(); |
| 202 return false, "item-not-found"; | 206 return false, "item-not-found"; |
| 203 end | 207 end |
| 204 return true, node_obj.subscribers[jid]; | 208 return true, node_obj.subscribers[jid]; |
| 205 end | 209 end |
| 206 | 210 |
| 207 function service:create(node, actor) | 211 function service:create(node, actor, options) |
| 208 -- Access checking | 212 -- Access checking |
| 209 if not self:may(node, actor, "create") then | 213 if not self:may(node, actor, "create") then |
| 210 return false, "forbidden"; | 214 return false, "forbidden"; |
| 211 end | 215 end |
| 212 -- | 216 -- |
| 216 | 220 |
| 217 self.data[node] = {}; | 221 self.data[node] = {}; |
| 218 self.nodes[node] = { | 222 self.nodes[node] = { |
| 219 name = node; | 223 name = node; |
| 220 subscribers = {}; | 224 subscribers = {}; |
| 221 config = {}; | 225 config = setmetatable(options or {}, {__index=self.node_defaults}); |
| 222 affiliations = {}; | 226 affiliations = {}; |
| 223 }; | 227 }; |
| 224 setmetatable(self.nodes[node], { __index = { data = self.data[node] } }); -- COMPAT | 228 setmetatable(self.nodes[node], { __index = { data = self.data[node] } }); -- COMPAT |
| 225 self.events.fire_event("node-created", { node = node, actor = actor }); | 229 self.events.fire_event("node-created", { node = node, actor = actor }); |
| 226 local ok, err = self:set_affiliation(node, true, actor, "owner"); | 230 local ok, err = self:set_affiliation(node, true, actor, "owner"); |
| 257 return i; | 261 return i; |
| 258 end | 262 end |
| 259 end | 263 end |
| 260 end | 264 end |
| 261 | 265 |
| 266 local function trim_items(data, max) | |
| 267 max = tonumber(max); | |
| 268 if not max or #data <= max then return end | |
| 269 repeat | |
| 270 data[t_remove(data, 1)] = nil; | |
| 271 until #data <= max | |
| 272 end | |
| 273 | |
| 262 function service:publish(node, actor, id, item) | 274 function service:publish(node, actor, id, item) |
| 263 -- Access checking | 275 -- Access checking |
| 264 if not self:may(node, actor, "publish") then | 276 if not self:may(node, actor, "publish") then |
| 265 return false, "forbidden"; | 277 return false, "forbidden"; |
| 266 end | 278 end |
| 276 end | 288 end |
| 277 node_obj = self.nodes[node]; | 289 node_obj = self.nodes[node]; |
| 278 end | 290 end |
| 279 local node_data = self.data[node]; | 291 local node_data = self.data[node]; |
| 280 remove_item_by_id(node_data, id); | 292 remove_item_by_id(node_data, id); |
| 281 node_data[#self.data[node] + 1] = id; | 293 node_data[#node_data + 1] = id; |
| 282 node_data[id] = item; | 294 node_data[id] = item; |
| 295 trim_items(node_data, node_obj.config["pubsub#max_items"]); | |
| 283 self.events.fire_event("item-published", { node = node, actor = actor, id = id, item = item }); | 296 self.events.fire_event("item-published", { node = node, actor = actor, id = id, item = item }); |
| 284 self.config.broadcaster("items", node, node_obj.subscribers, item); | 297 self.config.broadcaster("items", node, node_obj.subscribers, item); |
| 285 return true; | 298 return true; |
| 286 end | 299 end |
| 287 | 300 |
| 409 end | 422 end |
| 410 node_obj.capabilities = capabilities; | 423 node_obj.capabilities = capabilities; |
| 411 return true; | 424 return true; |
| 412 end | 425 end |
| 413 | 426 |
| 427 function service:set_node_config(node, actor, new_config) | |
| 428 if not self:may(node, actor, "configure") then | |
| 429 return false, "forbidden"; | |
| 430 end | |
| 431 | |
| 432 local node_obj = self.nodes[node]; | |
| 433 if not node_obj then | |
| 434 return false, "item-not-found"; | |
| 435 end | |
| 436 | |
| 437 for k,v in pairs(new_config) do | |
| 438 node_obj.config[k] = v; | |
| 439 end | |
| 440 trim_items(self.data[node], node_obj.config["pubsub#max_items"]); | |
| 441 | |
| 442 return true; | |
| 443 end | |
| 444 | |
| 414 return _M; | 445 return _M; |
