Software /
code /
prosody
Annotate
core/moduleapi.lua @ 11571:a8f0f87e115a
prosody: Close the state on exit (ie garbage-collect everything)
This ensures __gc is called on everything that may need it, such as
database connections.
It was reported in the chat by Happy that SQLite3 does not close its
state cleanly in WAL mode, leaving the WAL file behind. This is probably
rather a bug in mod_storage_sql, but forcing a final GC sweep should
also help with such things everywhere.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 18 May 2021 20:08:37 +0200 |
parent | 11523:5f15ab7c6ae5 |
child | 11821:a9ad287c3388 |
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 | 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; |