Mercurial > prosody-hg
comparison util/pubsub.lua @ 8502:6c2c2fc4b8dd
util.pubsub: Support a 'nodestore' for persisting nodes (same API as kv stores)
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 02 Feb 2018 19:31:03 +0000 |
| parents | 8d9e2c2095dd |
| children | 059183e5571e |
comparison
equal
deleted
inserted
replaced
| 8501:8d9e2c2095dd | 8502:6c2c2fc4b8dd |
|---|---|
| 15 ["persist_items"] = false; | 15 ["persist_items"] = false; |
| 16 ["max_items"] = 20; | 16 ["max_items"] = 20; |
| 17 }; | 17 }; |
| 18 local default_node_config_mt = { __index = default_node_config }; | 18 local default_node_config_mt = { __index = default_node_config }; |
| 19 | 19 |
| 20 -- Storage helper functions | |
| 21 | |
| 22 local function load_node_from_store(nodestore, node_name) | |
| 23 local node = nodestore:get(node_name); | |
| 24 node.config = setmetatable(node.config or {}, default_node_config_mt); | |
| 25 return node; | |
| 26 end | |
| 27 | |
| 28 local function save_node_to_store(nodestore, node) | |
| 29 return nodestore:set(node.name, { | |
| 30 name = node.name; | |
| 31 config = node.config; | |
| 32 subscribers = node.subscribers; | |
| 33 affiliations = node.affiliations; | |
| 34 }); | |
| 35 end | |
| 36 | |
| 37 -- Create and return a new service object | |
| 20 local function new(config) | 38 local function new(config) |
| 21 config = config or {}; | 39 config = config or {}; |
| 22 return setmetatable({ | 40 |
| 41 local service = setmetatable({ | |
| 23 config = setmetatable(config, default_config_mt); | 42 config = setmetatable(config, default_config_mt); |
| 24 node_defaults = setmetatable(config.node_defaults or {}, default_node_config_mt); | 43 node_defaults = setmetatable(config.node_defaults or {}, default_node_config_mt); |
| 25 affiliations = {}; | 44 affiliations = {}; |
| 26 subscriptions = {}; | 45 subscriptions = {}; |
| 27 nodes = {}; | 46 nodes = {}; |
| 28 data = {}; | 47 data = {}; |
| 29 events = events.new(); | 48 events = events.new(); |
| 30 }, service_mt); | 49 }, service_mt); |
| 50 | |
| 51 -- Load nodes from storage, if we have a store and it supports iterating over stored items | |
| 52 if config.nodestore and config.nodestore.users then | |
| 53 for node_name in config.nodestore:users() do | |
| 54 service.nodes[node_name] = load_node_from_store(config.nodestore, node_name); | |
| 55 service.data[node_name] = config.itemstore(service.nodes[node_name].config, node_name); | |
| 56 end | |
| 57 end | |
| 58 | |
| 59 return service; | |
| 31 end | 60 end |
| 32 | 61 |
| 33 --- Service methods | 62 --- Service methods |
| 34 | 63 |
| 35 local service = {}; | 64 local service = {}; |
| 217 name = node; | 246 name = node; |
| 218 subscribers = {}; | 247 subscribers = {}; |
| 219 config = setmetatable(options or {}, {__index=self.node_defaults}); | 248 config = setmetatable(options or {}, {__index=self.node_defaults}); |
| 220 affiliations = {}; | 249 affiliations = {}; |
| 221 }; | 250 }; |
| 251 | |
| 252 if self.config.nodestore then | |
| 253 local ok, err = save_node_to_store(self.config.nodestore, self.nodes[node]); | |
| 254 if not ok then | |
| 255 self.nodes[node] = nil; | |
| 256 return ok, err; | |
| 257 end | |
| 258 end | |
| 259 | |
| 222 self.data[node] = self.config.itemstore(self.nodes[node].config, node); | 260 self.data[node] = self.config.itemstore(self.nodes[node].config, node); |
| 223 self.events.fire_event("node-created", { node = node, actor = actor }); | 261 self.events.fire_event("node-created", { node = node, actor = actor }); |
| 224 local ok, err = self:set_affiliation(node, true, actor, "owner"); | 262 local ok, err = self:set_affiliation(node, true, actor, "owner"); |
| 225 if not ok then | 263 if not ok then |
| 226 self.nodes[node] = nil; | 264 self.nodes[node] = nil; |
| 227 self.data[node] = nil; | 265 self.data[node] = nil; |
| 228 end | 266 return ok, err; |
| 267 end | |
| 268 | |
| 229 return ok, err; | 269 return ok, err; |
| 230 end | 270 end |
| 231 | 271 |
| 232 function service:delete(node, actor) | 272 function service:delete(node, actor) |
| 233 -- Access checking | 273 -- Access checking |
