Annotate

core/moduleapi.lua @ 11523:5f15ab7c6ae5

Statistics: Rewrite statistics backends to use OpenMetrics The metric subsystem of Prosody has had some shortcomings from the perspective of the current state-of-the-art in metric observability. The OpenMetrics standard [0] is a formalization of the data model (and serialization format) of the well-known and widely-used Prometheus [1] software stack. The previous stats subsystem of Prosody did not map well to that format (see e.g. [2] and [3]); the key reason is that it was trying to do too much math on its own ([2]) while lacking first-class support for "families" of metrics ([3]) and structured metric metadata (despite the `extra` argument to metrics, there was no standard way of representing common things like "tags" or "labels"). Even though OpenMetrics has grown from the Prometheus world of monitoring, it maps well to other popular monitoring stacks such as: - InfluxDB (labels can be mapped to tags and fields as necessary) - Carbon/Graphite (labels can be attached to the metric name with dot-separation) - StatsD (see graphite when assuming that graphite is used as backend, which is the default) The util.statsd module has been ported to use the OpenMetrics model as a proof of concept. An implementation which exposes the util.statistics backend data as Prometheus metrics is ready for publishing in prosody-modules (most likely as mod_openmetrics_prometheus to avoid breaking existing 0.11 deployments). At the same time, the previous measure()-based API had one major advantage: It is really simple and easy to use without requiring lots of knowledge about OpenMetrics or similar concepts. For that reason as well as compatibility with existing code, it is preserved and may even be extended in the future. However, code relying on the `stats-updated` event as well as `get_stats` from `statsmanager` will break because the data model has changed completely; in case of `stats-updated`, the code will simply not run (as the event was renamed in order to avoid conflicts); the `get_stats` function has been removed completely (so it will cause a traceback when it is attempted to be used). Note that the measure_*_event methods have been removed from the module API. I was unable to find any uses or documentation and thus deemed they should not be ported. Re-implementation is possible when necessary. [0]: https://openmetrics.io/ [1]: https://prometheus.io/ [2]: #959 [3]: #960
author Jonas Schäfer <jonas@wielicki.name>
date Sun, 18 Apr 2021 11:47:41 +0200
parent 11148:1dc49accb58e
child 11821:a9ad287c3388
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 -- Prosody IM
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- Copyright (C) 2008-2012 Matthew Wild
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 -- Copyright (C) 2008-2012 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
4 --
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 -- COPYING file in the source package for more information.
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 --
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local array = require "util.array";
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 local set = require "util.set";
6651
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
11 local it = require "util.iterators";
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local logger = require "util.logger";
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local pluginloader = require "util.pluginloader";
4750
b3525f3c2fee moduleapi: Import util.timer
Matthew Wild <mwild1@gmail.com>
parents: 4747
diff changeset
14 local timer = require "util.timer";
6165
6a184b16b717 core.certmanager, core.moduleapi, mod_storage_sql, mod_storage_sql2: Import from util.paths
Kim Alvefur <zash@zash.se>
parents: 5825
diff changeset
15 local resolve_relative_path = require"util.paths".resolve_relative_path;
6659
0a494394cd3e moduleapi: Import util.stanza required for module:broadcast()
Matthew Wild <mwild1@gmail.com>
parents: 6656
diff changeset
16 local st = require "util.stanza";
9747
c8240f931a68 core.moduleapi: Move util imports to top
Kim Alvefur <zash@zash.se>
parents: 9733
diff changeset
17 local cache = require "util.cache";
10576
f88f1151bc72 core.moduleapi: Rename local name for util.error for consistency
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
18 local errors = require "util.error";
9747
c8240f931a68 core.moduleapi: Move util imports to top
Kim Alvefur <zash@zash.se>
parents: 9733
diff changeset
19 local promise = require "util.promise";
9866
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
20 local time_now = require "util.time".now;
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
21 local format = require "util.format".format;
10595
17bab303daf5 core.moduleapi: Hook correct event type in some cases
Kim Alvefur <zash@zash.se>
parents: 10576
diff changeset
22 local jid_node = require "util.jid".node;
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat;
5021
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4896
diff changeset
25 local error, setmetatable, type = error, setmetatable, type;
7162
d0b64f1e4f5d loggingmanager,modulemanager,moduleapi: Localize unpack compatible with Lua 5.2+
Kim Alvefur <zash@zash.se>
parents: 7127
diff changeset
26 local ipairs, pairs, select = ipairs, pairs, select;
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 local tonumber, tostring = tonumber, tostring;
6414
31c15004bfb0 core.moduleapi: Use require instead of global to get storagemanager in module:open_store()
Kim Alvefur <zash@zash.se>
parents: 6165
diff changeset
28 local require = require;
9686
e52e4e6e7ffb moduleapi: Use pack from util.table
Kim Alvefur <zash@zash.se>
parents: 9556
diff changeset
29 local pack = table.pack or require "util.table".pack; -- table.pack is only in 5.2
7164
af26e8eb591f Merge 0.10->trunk
Kim Alvefur <zash@zash.se>
parents: 7142 7163
diff changeset
30 local unpack = table.unpack or unpack; --luacheck: ignore 113 -- renamed in 5.2
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 local prosody = prosody;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 local hosts = prosody.hosts;
5434
9dd36e20c1e3 moduleapi: assert() that prosody.core_post_stanza is not nil
Matthew Wild <mwild1@gmail.com>
parents: 5412
diff changeset
34
9dd36e20c1e3 moduleapi: assert() that prosody.core_post_stanza is not nil
Matthew Wild <mwild1@gmail.com>
parents: 5412
diff changeset
35 -- FIXME: This assert() is to try and catch an obscure bug (2013-04-05)
9dd36e20c1e3 moduleapi: assert() that prosody.core_post_stanza is not nil
Matthew Wild <mwild1@gmail.com>
parents: 5412
diff changeset
36 local core_post_stanza = assert(prosody.core_post_stanza,
9dd36e20c1e3 moduleapi: assert() that prosody.core_post_stanza is not nil
Matthew Wild <mwild1@gmail.com>
parents: 5412
diff changeset
37 "prosody.core_post_stanza is nil, please report this as a bug");
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 -- Registry of shared module data
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 local shared_data = setmetatable({}, { __mode = "v" });
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local NULL = {};
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 local api = {};
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 -- Returns the name of the current module
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 function api:get_name()
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 return self.name;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 -- Returns the host that the current module is serving
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 function api:get_host()
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 return self.host;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 function api:get_host_type()
5771
c4ed6680bf8d moduleapi: module:get_host_type() now returns 'global' for * and 'local' for non-components
Matthew Wild <mwild1@gmail.com>
parents: 5530
diff changeset
57 return (self.host == "*" and "global") or hosts[self.host].type or "local";
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 function api:set_global()
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 self.host = "*";
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 -- Update the logger
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 local _log = logger.init("mod_"..self.name);
6656
58c111a39d27 moduleapi: Add luacheck annotation
Matthew Wild <mwild1@gmail.com>
parents: 6655
diff changeset
64 self.log = function (self, ...) return _log(...); end; --luacheck: ignore self
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 self._log = _log;
4605
69746db53125 moduleapi: Set module.global = true when module:set_global() is called
Matthew Wild <mwild1@gmail.com>
parents: 4539
diff changeset
66 self.global = true;
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 function api:add_feature(xmlns)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 self:add_item("feature", xmlns);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 end
6655
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
72 function api:add_identity(category, identity_type, name)
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
73 self:add_item("identity", {category = category, type = identity_type, name = name});
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 function api:add_extension(data)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 self:add_item("extension", data);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 function api:fire_event(...)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 return (hosts[self.host] or prosody).events.fire_event(...);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82
4534
7a0a31c4f6c5 modulemanager, moduleapi: Replace hooks multitable with an event_handlers map stored in individual modules. Also adds module:hook_object_event() to hook events on any util.events compatible object.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
83 function api:hook_object_event(object, event, handler, priority)
4896
27cda15104f2 modulemanager, moduleapi: Turn module.event_handlers into a multitable and track object->event->handler associations correctly (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4893
diff changeset
84 self.event_handlers:set(object, event, handler, true);
4534
7a0a31c4f6c5 modulemanager, moduleapi: Replace hooks multitable with an event_handlers map stored in individual modules. Also adds module:hook_object_event() to hook events on any util.events compatible object.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
85 return object.add_handler(event, handler, priority);
7a0a31c4f6c5 modulemanager, moduleapi: Replace hooks multitable with an event_handlers map stored in individual modules. Also adds module:hook_object_event() to hook events on any util.events compatible object.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
86 end
7a0a31c4f6c5 modulemanager, moduleapi: Replace hooks multitable with an event_handlers map stored in individual modules. Also adds module:hook_object_event() to hook events on any util.events compatible object.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
87
4708
0e324923ff95 moduleapi: Fix parameters to unhook_object_event()
Matthew Wild <mwild1@gmail.com>
parents: 4707
diff changeset
88 function api:unhook_object_event(object, event, handler)
6654
22a7ee3379bc moduleapi: Clear self.event_handlers when unhooking an event, to prevent leaks
Matthew Wild <mwild1@gmail.com>
parents: 6653
diff changeset
89 self.event_handlers:set(object, event, handler, nil);
4695
838ad61c6b2c moduleapi: Add module:unhook_object_event()
Matthew Wild <mwild1@gmail.com>
parents: 4666
diff changeset
90 return object.remove_handler(event, handler);
838ad61c6b2c moduleapi: Add module:unhook_object_event()
Matthew Wild <mwild1@gmail.com>
parents: 4666
diff changeset
91 end
838ad61c6b2c moduleapi: Add module:unhook_object_event()
Matthew Wild <mwild1@gmail.com>
parents: 4666
diff changeset
92
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 function api:hook(event, handler, priority)
4534
7a0a31c4f6c5 modulemanager, moduleapi: Replace hooks multitable with an event_handlers map stored in individual modules. Also adds module:hook_object_event() to hook events on any util.events compatible object.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
94 return self:hook_object_event((hosts[self.host] or prosody).events, event, handler, priority);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 function api:hook_global(event, handler, priority)
4534
7a0a31c4f6c5 modulemanager, moduleapi: Replace hooks multitable with an event_handlers map stored in individual modules. Also adds module:hook_object_event() to hook events on any util.events compatible object.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
98 return self:hook_object_event(prosody.events, event, handler, priority);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100
4719
2087d42f1e77 moduleapi: Rename module:hook_stanza() -> module:hook_tag() (hook_stanza works for compat)
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
101 function api:hook_tag(xmlns, name, handler, priority)
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 if not handler and type(name) == "function" then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 -- If only 2 options then they specified no xmlns
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 xmlns, name, handler, priority = nil, xmlns, name, handler;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 elseif not (handler and name) then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 self:log("warn", "Error: Insufficient parameters to module:hook_stanza()");
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 return;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 end
7947
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7646
diff changeset
109 return self:hook("stanza/"..(xmlns and (xmlns..":") or "")..name,
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7646
diff changeset
110 function (data) return handler(data.origin, data.stanza, data); end, priority);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 end
4719
2087d42f1e77 moduleapi: Rename module:hook_stanza() -> module:hook_tag() (hook_stanza works for compat)
Matthew Wild <mwild1@gmail.com>
parents: 4718
diff changeset
112 api.hook_stanza = api.hook_tag; -- COMPAT w/pre-0.9
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113
5825
ac5e05ffc921 moduleapi: Add module:unhook()
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
114 function api:unhook(event, handler)
ac5e05ffc921 moduleapi: Add module:unhook()
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
115 return self:unhook_object_event((hosts[self.host] or prosody).events, event, handler);
ac5e05ffc921 moduleapi: Add module:unhook()
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
116 end
ac5e05ffc921 moduleapi: Add module:unhook()
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
117
6640
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
118 function api:wrap_object_event(events_object, event, handler)
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
119 return self:hook_object_event(assert(events_object.wrappers, "no wrappers"), event, handler);
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
120 end
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
121
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
122 function api:wrap_event(event, handler)
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
123 return self:wrap_object_event((hosts[self.host] or prosody).events, event, handler);
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
124 end
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
125
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
126 function api:wrap_global(event, handler)
6652
06116b2789f0 moduleapi: Remove accidental use of undefined and unnecessary 'priority' variable
Matthew Wild <mwild1@gmail.com>
parents: 6651
diff changeset
127 return self:hook_object_event(prosody.events, event, handler);
6640
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
128 end
859e9af53aa1 moduleapi: New methods for modules to conveniently wrap events
Matthew Wild <mwild1@gmail.com>
parents: 6639
diff changeset
129
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 function api:require(lib)
7115
805d068d2fd5 modulemanager, util.pluginloader: Move logic for locating some module libraries to pluginloader, to fix problems with non-filesystem errors being masked by the second load_code call
Matthew Wild <mwild1@gmail.com>
parents: 6779
diff changeset
131 local f, n = pluginloader.load_code_ext(self.name, lib, "lib.lua", self.environment);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 if not f then error("Failed to load plugin library '"..lib.."', error: "..n); end -- FIXME better error message
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 return f();
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135
4538
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
136 function api:depends(name)
6779
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6659
diff changeset
137 local modulemanager = require"core.modulemanager";
9556
e4c09e335bd9 moduleapi: Prevent loading disabled module as dependency of enabled one
Kim Alvefur <zash@zash.se>
parents: 9509
diff changeset
138 if self:get_option_inherited_set("modules_disabled", {}):contains(name) then
e4c09e335bd9 moduleapi: Prevent loading disabled module as dependency of enabled one
Kim Alvefur <zash@zash.se>
parents: 9509
diff changeset
139 error("Dependency on disabled module mod_"..name);
e4c09e335bd9 moduleapi: Prevent loading disabled module as dependency of enabled one
Kim Alvefur <zash@zash.se>
parents: 9509
diff changeset
140 end
4538
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
141 if not self.dependencies then
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
142 self.dependencies = {};
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
143 self:hook("module-reloaded", function (event)
4854
dab55c6f7710 moduleapi: Don't auto-reload self when already reloading (fixes reload of modules with cyclic dependencies)
Matthew Wild <mwild1@gmail.com>
parents: 4790
diff changeset
144 if self.dependencies[event.module] and not self.reloading then
4538
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
145 self:log("info", "Auto-reloading due to reload of %s:%s", event.host, event.module);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
146 modulemanager.reload(self.host, self.name);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
147 return;
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
148 end
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
149 end);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
150 self:hook("module-unloaded", function (event)
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
151 if self.dependencies[event.module] then
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
152 self:log("info", "Auto-unloading due to unload of %s:%s", event.host, event.module);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
153 modulemanager.unload(self.host, self.name);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
154 end
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
155 end);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
156 end
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
157 local mod = modulemanager.get_module(self.host, name) or modulemanager.get_module("*", name);
4707
d8fc9a1aabeb moduleapi: module:depends(): Don't load shared modules onto the current host if the current host is '*'...
Matthew Wild <mwild1@gmail.com>
parents: 4695
diff changeset
158 if mod and mod.module.host == "*" and self.host ~= "*"
d8fc9a1aabeb moduleapi: module:depends(): Don't load shared modules onto the current host if the current host is '*'...
Matthew Wild <mwild1@gmail.com>
parents: 4695
diff changeset
159 and modulemanager.module_has_method(mod, "add_host") then
5077
6c2c8bf36d22 moduleapi: Clarify comment
Matthew Wild <mwild1@gmail.com>
parents: 5053
diff changeset
160 mod = nil; -- Target is a shared module, so we still want to load it on our host
4663
24524d70a50a moduleapi: module:depends(): Load shared modules onto the current host even if they are loaded globally already
Matthew Wild <mwild1@gmail.com>
parents: 4661
diff changeset
161 end
4538
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
162 if not mod then
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
163 local err;
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
164 mod, err = modulemanager.load(self.host, name);
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
165 if not mod then
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
166 return error(("Unable to load required module, mod_%s: %s"):format(name, ((err or "unknown error"):gsub("%-", " ")) ));
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
167 end
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
168 end
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
169 self.dependencies[name] = true;
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
170 return mod;
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
171 end
d0a89c1c43fd moduleapi: Add module:depends(), a way to safely depend upon another module at runtime
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
172
9149
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
173 local function get_shared_table_from_path(module, tables, path)
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
174 if path:sub(1,1) ~= "/" then -- Prepend default components
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
175 local default_path_components = { module.host, module.name };
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
176 local n_components = select(2, path:gsub("/", "%1"));
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
177 path = (n_components<#default_path_components and "/" or "")
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
178 ..t_concat(default_path_components, "/", 1, #default_path_components-n_components).."/"..path;
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
179 end
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
180 local shared = tables[path];
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
181 if not shared then
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
182 shared = {};
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
183 if path:match("%-cache$") then
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
184 setmetatable(shared, { __mode = "kv" });
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
185 end
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
186 tables[path] = shared;
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
187 end
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
188 return shared;
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
189 end
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
190
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
191 -- Returns a shared table at the specified virtual path
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
192 -- Intentionally does not allow the table to be _set_, it
4539
3cbfa768eb06 moduleapi: Add module:shared(), a way to easily share data between multiple loaded modules
Matthew Wild <mwild1@gmail.com>
parents: 4538
diff changeset
193 -- is auto-created if it does not exist.
9149
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
194 function api:shared(path)
4651
d1739d72100a moduleapi: Have modules internally store a reference to shared tables they use, to ensure they don't get collected while any module that had access to that table is still loaded (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4614
diff changeset
195 if not self.shared_data then self.shared_data = {}; end
9149
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
196 local shared = get_shared_table_from_path(self, shared_data, path);
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
197 self.shared_data[path] = shared;
d03f21729b2c moduleapi: Remove multiple-parameters feature from module:shared()
Matthew Wild <mwild1@gmail.com>
parents: 9042
diff changeset
198 return shared;
4539
3cbfa768eb06 moduleapi: Add module:shared(), a way to easily share data between multiple loaded modules
Matthew Wild <mwild1@gmail.com>
parents: 4538
diff changeset
199 end
3cbfa768eb06 moduleapi: Add module:shared(), a way to easily share data between multiple loaded modules
Matthew Wild <mwild1@gmail.com>
parents: 4538
diff changeset
200
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201 function api:get_option(name, default_value)
8993
bd9b67f742c9 moduleapi: Lazy-load configmanager on demand simplify dependency graph
Kim Alvefur <zash@zash.se>
parents: 8533
diff changeset
202 local config = require "core.configmanager";
5377
898454038524 core.*: Complete removal of all traces of the "core" section and section-related code.
Kim Alvefur <zash@zash.se>
parents: 5163
diff changeset
203 local value = config.get(self.host, name);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 if value == nil then
5377
898454038524 core.*: Complete removal of all traces of the "core" section and section-related code.
Kim Alvefur <zash@zash.se>
parents: 5163
diff changeset
205 value = default_value;
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
206 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
207 return value;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209
7975
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
210 function api:get_option_scalar(name, default_value)
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
211 local value = self:get_option(name, default_value);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
212 if type(value) == "table" then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213 if #value > 1 then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
214 self:log("error", "Config option '%s' does not take a list, using just the first item", name);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216 value = value[1];
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
217 end
7975
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
218 return value;
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
219 end
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
220
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
221 function api:get_option_string(name, default_value)
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
222 local value = self:get_option_scalar(name, default_value);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 if value == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224 return nil;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226 return tostring(value);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
228
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229 function api:get_option_number(name, ...)
7975
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
230 local value = self:get_option_scalar(name, ...);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 local ret = tonumber(value);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232 if value ~= nil and ret == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
233 self:log("error", "Config option '%s' not understood, expecting a number", name);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235 return ret;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
238 function api:get_option_boolean(name, ...)
7975
c64ddee9d671 core.moduleapi: Factor out code for getting a scalar config option
Kim Alvefur <zash@zash.se>
parents: 7947
diff changeset
239 local value = self:get_option_scalar(name, ...);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240 if value == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
241 return nil;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243 local ret = value == true or value == "true" or value == 1 or nil;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
244 if ret == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
245 ret = (value == false or value == "false" or value == 0);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
246 if ret then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
247 ret = false;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248 else
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
249 ret = nil;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
252 if ret == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
253 self:log("error", "Config option '%s' not understood, expecting true/false", name);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 return ret;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
256 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
257
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 function api:get_option_array(name, ...)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 local value = self:get_option(name, ...);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
260
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261 if value == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262 return nil;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
263 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
264
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265 if type(value) ~= "table" then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 return array{ value }; -- Assume any non-list is a single-item list
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
267 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
268
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
269 return array():append(value); -- Clone
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
271
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
272 function api:get_option_set(name, ...)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
273 local value = self:get_option_array(name, ...);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
274
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 if value == nil then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 return nil;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
277 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5771
diff changeset
278
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
279 return set.new(value);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281
5527
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
282 function api:get_option_inherited_set(name, ...)
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
283 local value = self:get_option_set(name, ...);
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
284 local global_value = self:context("*"):get_option_set(name, ...);
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
285 if not value then
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
286 return global_value;
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
287 elseif not global_value then
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
288 return value;
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
289 end
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
290 value:include(global_value);
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
291 return value;
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
292 end
7e7f45f587a1 moduleapi: Add module:get_option_inherited_set() to return a set that inherits items from a globally set set, if set
Matthew Wild <mwild1@gmail.com>
parents: 5526
diff changeset
293
7127
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
294 function api:get_option_path(name, default, parent)
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
295 if parent == nil then
9509
b57353f76c83 core.moduleapi: Remove redundant condition
Kim Alvefur <zash@zash.se>
parents: 9149
diff changeset
296 parent = self:get_directory();
7127
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
297 elseif prosody.paths[parent] then
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
298 parent = prosody.paths[parent];
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
299 end
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
300 local value = self:get_option_string(name, default);
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
301 if value == nil then
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
302 return nil;
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
303 end
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
304 return resolve_relative_path(parent, value);
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
305 end
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
306
27557dd7b460 moduleapi: Add API method for getting a file path
Kim Alvefur <zash@zash.se>
parents: 7115
diff changeset
307
5526
d54011a23b20 moduleapi: Add module:context(host) to produce a fake API context for a given host (or global). module:context("*"):get_option("foo") to get global options.
Matthew Wild <mwild1@gmail.com>
parents: 5498
diff changeset
308 function api:context(host)
d54011a23b20 moduleapi: Add module:context(host) to produce a fake API context for a given host (or global). module:context("*"):get_option("foo") to get global options.
Matthew Wild <mwild1@gmail.com>
parents: 5498
diff changeset
309 return setmetatable({host=host or "*"}, {__index=self,__newindex=self});
d54011a23b20 moduleapi: Add module:context(host) to produce a fake API context for a given host (or global). module:context("*"):get_option("foo") to get global options.
Matthew Wild <mwild1@gmail.com>
parents: 5498
diff changeset
310 end
d54011a23b20 moduleapi: Add module:context(host) to produce a fake API context for a given host (or global). module:context("*"):get_option("foo") to get global options.
Matthew Wild <mwild1@gmail.com>
parents: 5498
diff changeset
311
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
312 function api:add_item(key, value)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
313 self.items = self.items or {};
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
314 self.items[key] = self.items[key] or {};
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
315 t_insert(self.items[key], value);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
316 self:fire_event("item-added/"..key, {source = self, item = value});
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
317 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
318 function api:remove_item(key, value)
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
319 local t = self.items and self.items[key] or NULL;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
320 for i = #t,1,-1 do
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321 if t[i] == value then
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
322 t_remove(self.items[key], i);
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
323 self:fire_event("item-removed/"..key, {source = self, item = value});
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
324 return value;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
326 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
328
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329 function api:get_host_items(key)
6779
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6659
diff changeset
330 local modulemanager = require"core.modulemanager";
5412
a5fcda77c6b1 moduleapi: have get_host_items wrap on get_items from modulemanager, also add has_{feature/identity} to the API.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
331 local result = modulemanager.get_items(key, self.host) or {};
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332 return result;
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
333 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334
6655
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
335 function api:handle_items(item_type, added_cb, removed_cb, existing)
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
336 self:hook("item-added/"..item_type, added_cb);
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
337 self:hook("item-removed/"..item_type, removed_cb);
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 if existing ~= false then
6655
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
339 for _, item in ipairs(self:get_host_items(item_type)) do
4531
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340 added_cb({ item = item });
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343 end
c778ce7e3c78 modulemanager: Move in-module API functions to core.moduleapi (half the file size, yay)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
344
4613
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
345 function api:provides(name, item)
5529
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
346 -- if not item then item = setmetatable({}, { __index = function(t,k) return rawget(self.environment, k); end }); end
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
347 if not item then
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
348 item = {}
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
349 for k,v in pairs(self.environment) do
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
350 if k ~= "module" then item[k] = v; end
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
351 end
af58eea131b4 moduleapi: module:provides called without an item makes a copy of the environment instead. Fixes warnings about non-existent globals
Kim Alvefur <zash@zash.se>
parents: 5527
diff changeset
352 end
4613
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
353 if not item.name then
4660
96b40b5e8ea8 moduleapi: module:provides(): Fix usage of wrong table
Matthew Wild <mwild1@gmail.com>
parents: 4651
diff changeset
354 local item_name = self.name;
4613
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
355 -- Strip a provider prefix to find the item name
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
356 -- (e.g. "auth_foo" -> "foo" for an auth provider)
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
357 if item_name:find(name.."_", 1, true) == 1 then
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
358 item_name = item_name:sub(#name+2);
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
359 end
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
360 item.name = item_name;
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
361 end
5530
d83482fc4a81 moduleapi: in module:provides(), add the name of the module in item._provided_by
Kim Alvefur <zash@zash.se>
parents: 5529
diff changeset
362 item._provided_by = self.name;
4661
76db5d0a2104 moduleapi: module:provides(): Add "-provider" onto the key name
Matthew Wild <mwild1@gmail.com>
parents: 4660
diff changeset
363 self:add_item(name.."-provider", item);
4613
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
364 end
27fbc9c69eb5 moduleapi: Add module:provides(), a shortcut to add an item with the current module's name
Matthew Wild <mwild1@gmail.com>
parents: 4605
diff changeset
365
7342
79a5db780e8b moduleapi: Allow an origin session to be passed to module:send()
Kim Alvefur <zash@zash.se>
parents: 7163
diff changeset
366 function api:send(stanza, origin)
79a5db780e8b moduleapi: Allow an origin session to be passed to module:send()
Kim Alvefur <zash@zash.se>
parents: 7163
diff changeset
367 return core_post_stanza(origin or hosts[self.host], stanza);
4614
20940729c1b4 moduleapi: Add module:send() as an alias for core_post_stanza() from the current host's origin
Matthew Wild <mwild1@gmail.com>
parents: 4613
diff changeset
368 end
20940729c1b4 moduleapi: Add module:send() as an alias for core_post_stanza() from the current host's origin
Matthew Wild <mwild1@gmail.com>
parents: 4613
diff changeset
369
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
370 function api:send_iq(stanza, origin, timeout)
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
371 local iq_cache = self._iq_cache;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
372 if not iq_cache then
9747
c8240f931a68 core.moduleapi: Move util imports to top
Kim Alvefur <zash@zash.se>
parents: 9733
diff changeset
373 iq_cache = cache.new(256, function (_, iq)
10576
f88f1151bc72 core.moduleapi: Rename local name for util.error for consistency
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
374 iq.reject(errors.new({
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
375 type = "wait", condition = "resource-constraint",
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
376 text = "evicted from iq tracking cache"
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
377 }));
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
378 end);
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
379 self._iq_cache = iq_cache;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
380 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
381
10214
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
382 local event_type;
10595
17bab303daf5 core.moduleapi: Hook correct event type in some cases
Kim Alvefur <zash@zash.se>
parents: 10576
diff changeset
383 if not jid_node(stanza.attr.from) then
10214
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
384 event_type = "host";
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
385 else -- assume bare since we can't hook full jids
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
386 event_type = "bare";
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
387 end
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
388 local result_event = "iq-result/"..event_type.."/"..stanza.attr.id;
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
389 local error_event = "iq-error/"..event_type.."/"..stanza.attr.id;
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
390 local cache_key = event_type.."/"..stanza.attr.id;
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
391
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
392 local p = promise.new(function (resolve, reject)
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
393 local function result_handler(event)
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
394 if event.stanza.attr.from == stanza.attr.to then
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
395 resolve(event);
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
396 return true;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
397 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
398 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
399
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
400 local function error_handler(event)
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
401 if event.stanza.attr.from == stanza.attr.to then
10576
f88f1151bc72 core.moduleapi: Rename local name for util.error for consistency
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
402 reject(errors.from_stanza(event.stanza, event));
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
403 return true;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
404 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
405 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
406
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
407 if iq_cache:get(cache_key) then
10576
f88f1151bc72 core.moduleapi: Rename local name for util.error for consistency
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
408 reject(errors.new({
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
409 type = "modify", condition = "conflict",
10213
ee62754b0233 core.moduleapi: Uppercase "IQ stanza" for consistency
Kim Alvefur <zash@zash.se>
parents: 9930
diff changeset
410 text = "IQ stanza id attribute already used",
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
411 }));
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
412 return;
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
413 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
414
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
415 self:hook(result_event, result_handler);
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
416 self:hook(error_event, error_handler);
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
417
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
418 local timeout_handle = self:add_timer(timeout or 120, function ()
10576
f88f1151bc72 core.moduleapi: Rename local name for util.error for consistency
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
419 reject(errors.new({
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
420 type = "wait", condition = "remote-server-timeout",
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
421 text = "IQ stanza timed out",
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
422 }));
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
423 end);
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
424
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
425 local ok = iq_cache:set(cache_key, {
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
426 reject = reject, resolve = resolve,
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
427 timeout_handle = timeout_handle,
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
428 result_handler = result_handler, error_handler = error_handler;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
429 });
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
430
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
431 if not ok then
10576
f88f1151bc72 core.moduleapi: Rename local name for util.error for consistency
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
432 reject(errors.new({
9748
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
433 type = "wait", condition = "internal-server-error",
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
434 text = "Could not store IQ tracking data"
99199b53019f core.moduleapi: Use util.error for :send_iq errors
Kim Alvefur <zash@zash.se>
parents: 9747
diff changeset
435 }));
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
436 return;
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
437 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
438
10705
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
439 local wrapped_origin = setmetatable({
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
440 -- XXX Needed in some cases for replies to work correctly when sending queries internally.
10706
0230ceecb8a9 moduleapi: Rename argument to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 10705
diff changeset
441 send = function (reply)
0230ceecb8a9 moduleapi: Rename argument to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 10705
diff changeset
442 resolve({ stanza = reply });
10705
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
443 end;
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
444 }, {
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
445 __index = origin or hosts[self.host];
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
446 });
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
447
2cffb5ce9f7a moduleapi: Fix handling of replies to :send_iq from internal modules
Kim Alvefur <zash@zash.se>
parents: 10595
diff changeset
448 self:send(stanza, wrapped_origin);
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
449 end);
10214
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
450
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
451 p:finally(function ()
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
452 local iq = iq_cache:get(cache_key);
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
453 if iq then
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
454 self:unhook(result_event, iq.result_handler);
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
455 self:unhook(error_event, iq.error_handler);
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
456 iq.timeout_handle:stop();
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
457 iq_cache:set(cache_key, nil);
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
458 end
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
459 end);
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
460
f864e685e618 core.moduleapi: Restructure send_iq method for more atomic cleanup
Kim Alvefur <zash@zash.se>
parents: 10213
diff changeset
461 return p;
9733
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
462 end
9ab9aabafa80 core.moduleapi: Add a promise-based API for tracking IQ stanzas (fixes #714)
Kim Alvefur <zash@zash.se>
parents: 9686
diff changeset
463
6651
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
464 function api:broadcast(jids, stanza, iter)
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
465 for jid in (iter or it.values)(jids) do
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
466 local new_stanza = st.clone(stanza);
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
467 new_stanza.attr.to = jid;
9042
734ba7080b35 moduleapi: Use :send API from :broadcast for compactness
Kim Alvefur <zash@zash.se>
parents: 8994
diff changeset
468 self:send(new_stanza);
6651
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
469 end
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
470 end
deaa3d66dc2c moduleapi: Add module:broadcast() to send a stanza to a list of JIDs
Matthew Wild <mwild1@gmail.com>
parents: 6640
diff changeset
471
5899
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
472 local timer_methods = { }
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
473 local timer_mt = {
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
474 __index = timer_methods;
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
475 }
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
476 function timer_methods:stop( )
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
477 timer.stop(self.id);
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
478 end
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
479 timer_methods.disarm = timer_methods.stop
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
480 function timer_methods:reschedule(delay)
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
481 timer.reschedule(self.id, delay)
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
482 end
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
483
7142
67226eaef97c moduleapi: Silence luacheck warning about unused 'id' parameter
Matthew Wild <mwild1@gmail.com>
parents: 7141
diff changeset
484 local function timer_callback(now, id, t) --luacheck: ignore 212/id
5899
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
485 if t.module_env.loaded == false then return; end
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
486 return t.callback(now, unpack(t, 1, t.n));
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
487 end
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
488
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
489 function api:add_timer(delay, callback, ...)
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
490 local t = pack(...)
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
491 t.module_env = self;
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
492 t.callback = callback;
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
493 t.id = timer.add_task(delay, timer_callback, t);
26f54b462601 core/moduleapi: Return timer object from module:add_timer
daurnimator <quae@daurnimator.com>
parents: 5825
diff changeset
494 return setmetatable(t, timer_mt);
4666
fb522fbd495e moduleapi: Add module:add_timer(delay, callback) - automatically halts the timer on module unload
Matthew Wild <mwild1@gmail.com>
parents: 4663
diff changeset
495 end
fb522fbd495e moduleapi: Add module:add_timer(delay, callback) - automatically halts the timer on module unload
Matthew Wild <mwild1@gmail.com>
parents: 4663
diff changeset
496
4790
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
497 local path_sep = package.config:sub(1,1);
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
498 function api:get_directory()
11148
1dc49accb58e core.moduleapi: Return resource path from module:get_directory() (API BC)
Kim Alvefur <zash@zash.se>
parents: 11146
diff changeset
499 return self.resource_path or self.path and (self.path:gsub("%"..path_sep.."[^"..path_sep.."]*$", "")) or nil;
4790
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
500 end
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
501
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
502 function api:load_resource(path, mode)
11148
1dc49accb58e core.moduleapi: Return resource path from module:get_directory() (API BC)
Kim Alvefur <zash@zash.se>
parents: 11146
diff changeset
503 path = resolve_relative_path(self:get_directory(), path);
4790
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
504 return io.open(path, mode);
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
505 end
8bf710b19f65 moduleapi: Add module:get_directory() to get module file's directory, and module:load_resource() to load a file relative to that directory
Matthew Wild <mwild1@gmail.com>
parents: 4750
diff changeset
506
6655
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
507 function api:open_store(name, store_type)
a99ed5f5f709 moduleapi: Minor variable renaming to avoid clashes with the 'type' function
Matthew Wild <mwild1@gmail.com>
parents: 6654
diff changeset
508 return require"core.storagemanager".open(self.host, name or self.name, store_type);
5496
7a0b81b5ca71 moduleapi: Add module:open_store() as a front-end to storagemanager.open()
Matthew Wild <mwild1@gmail.com>
parents: 5434
diff changeset
509 end
7a0b81b5ca71 moduleapi: Add module:open_store() as a front-end to storagemanager.open()
Matthew Wild <mwild1@gmail.com>
parents: 5434
diff changeset
510
10885
2f751880767c core.moduleapi: Allow passing a config table trough :measure
Kim Alvefur <zash@zash.se>
parents: 10706
diff changeset
511 function api:measure(name, stat_type, conf)
8994
f17e768c1a99 moduleapi: Lazy-load statsmanager on demand
Kim Alvefur <zash@zash.se>
parents: 8993
diff changeset
512 local measure = require "core.statsmanager".measure;
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
513 local fixed_label_key, fixed_label_value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
514 if self.host ~= "*" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
515 fixed_label_key = "host"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
516 fixed_label_value = self.host
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
517 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
518 -- new_legacy_metric takes care of scoping for us, as it does not accept
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
519 -- an array of labels
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
520 -- the prosody_ prefix is automatically added by statsmanager for legacy
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
521 -- metrics.
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
522 return measure(stat_type, "mod_"..self.name.."/"..name, conf, fixed_label_key, fixed_label_value)
6556
74253c7beb9c moduleapi: Module API for statsmanager
Matthew Wild <mwild1@gmail.com>
parents: 6422
diff changeset
523 end
74253c7beb9c moduleapi: Module API for statsmanager
Matthew Wild <mwild1@gmail.com>
parents: 6422
diff changeset
524
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
525 function api:metric(type_, name, unit, description, label_keys, conf)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
526 local metric = require "core.statsmanager".metric;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
527 local is_scoped = self.host ~= "*"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
528 if is_scoped then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
529 -- prepend `host` label to label keys if this is not a global module
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
530 local orig_labels = label_keys
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
531 label_keys = array { "host" }
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
532 label_keys:append(orig_labels)
6639
3003d041c159 moduleapi: Experimental API for modules to measure the rate+duration of events
Matthew Wild <mwild1@gmail.com>
parents: 6556
diff changeset
533 end
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
534 local mf = metric(type_, "prosody_mod_"..self.name.."/"..name, unit, description, label_keys, conf)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
535 if is_scoped then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
536 -- make sure to scope the returned metric family to the current host
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
537 return mf:with_partial_label(self.host)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
538 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11148
diff changeset
539 return mf
6639
3003d041c159 moduleapi: Experimental API for modules to measure the rate+duration of events
Matthew Wild <mwild1@gmail.com>
parents: 6556
diff changeset
540 end
3003d041c159 moduleapi: Experimental API for modules to measure the rate+duration of events
Matthew Wild <mwild1@gmail.com>
parents: 6556
diff changeset
541
9866
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
542 local status_priorities = { error = 3, warn = 2, info = 1, core = 0 };
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
543
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
544 function api:set_status(status_type, status_message, override)
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
545 local priority = status_priorities[status_type];
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
546 if not priority then
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
547 self:log("error", "set_status: Invalid status type '%s', assuming 'info'");
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
548 status_type, priority = "info", status_priorities.info;
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
549 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
550 local current_priority = status_priorities[self.status_type] or 0;
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
551 -- By default an 'error' status can only be overwritten by another 'error' status
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
552 if (current_priority >= status_priorities.error and priority < current_priority and override ~= true)
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
553 or (override == false and current_priority > priority) then
9930
12a31296d63d moduleapi: Log suppressed status priority and message when not overriding
Matthew Wild <mwild1@gmail.com>
parents: 9929
diff changeset
554 self:log("debug", "moduleapi: ignoring status [prio %d override %s]: %s", priority, override, status_message);
9866
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
555 return;
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
556 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
557 self.status_type, self.status_message, self.status_time = status_type, status_message, time_now();
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
558 self:fire_event("module-status/updated", { name = self.name });
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
559 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
560
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
561 function api:log_status(level, msg, ...)
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
562 self:set_status(level, format(msg, ...));
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
563 return self:log(level, msg, ...);
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
564 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
565
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
566 function api:get_status()
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
567 return self.status_type, self.status_message, self.status_time;
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
568 end
09cc8c856e5e moduleapi: New API for modules to set a status
Matthew Wild <mwild1@gmail.com>
parents: 9750
diff changeset
569
6422
6d4d87a89026 core.module{manager,api}: Fix for 010b141e91ed (Thanks v1ct0r)
Kim Alvefur <zash@zash.se>
parents: 6415
diff changeset
570 return api;