Software /
code /
prosody
Annotate
util/rsm.lua @ 11962:9a70a543c727
util.async: Add next-tick configuration
Running woken runners in the next iteration of the event loop prevents
unexpected recursion, unexpected tracebacks, and is generally more
predictable.
The pattern is borrowed from util.promise, where we're now doing the same.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 29 Nov 2021 14:14:30 +0000 |
parent | 11428:d91def9fcfdd |
child | 12975:d10957394a3c |
rev | line source |
---|---|
7852 | 1 -- Prosody IM |
2 -- Copyright (C) 2008-2017 Matthew Wild | |
3 -- Copyright (C) 2008-2017 Waqas Hussain | |
4 -- Copyright (C) 2011-2017 Kim Alvefur | |
5 -- | |
6 -- This project is MIT/X11 licensed. Please see the | |
7 -- COPYING file in the source package for more information. | |
8 -- | |
9 -- XEP-0313: Message Archive Management for Prosody | |
10 -- | |
11 | |
7836
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 local stanza = require"util.stanza".stanza; |
10764
1fbfcc2f6805
util.rsm: Don't convert values to strings that should already be strings
Kim Alvefur <zash@zash.se>
parents:
10763
diff
changeset
|
13 local tonumber = tonumber; |
10761
b53193bb21cc
util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents:
7852
diff
changeset
|
14 local s_format = string.format; |
7836
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 local type = type; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 local pairs = pairs; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 |
10761
b53193bb21cc
util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents:
7852
diff
changeset
|
18 local function inttostr(n) |
b53193bb21cc
util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents:
7852
diff
changeset
|
19 return s_format("%d", n); |
b53193bb21cc
util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents:
7852
diff
changeset
|
20 end |
b53193bb21cc
util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents:
7852
diff
changeset
|
21 |
7836
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 local xmlns_rsm = 'http://jabber.org/protocol/rsm'; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 local element_parsers = {}; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 do |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 local parsers = element_parsers; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 local function xs_int(st) |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 return tonumber((st:get_text())); |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 local function xs_string(st) |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 return st:get_text(); |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 parsers.after = xs_string; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 parsers.before = function(st) |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 local text = st:get_text(); |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 return text == "" or text; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 end; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 parsers.max = xs_int; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 parsers.index = xs_int; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 parsers.first = function(st) |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 return { index = tonumber(st.attr.index); st:get_text() }; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 end; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 parsers.last = xs_string; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 parsers.count = xs_int; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 local element_generators = setmetatable({ |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 first = function(st, data) |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 if type(data) == "table" then |
10761
b53193bb21cc
util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents:
7852
diff
changeset
|
53 st:tag("first", { index = inttostr(data.index) }):text(data[1]):up(); |
7836
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 else |
11426
c7948491c5e4
util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents:
10764
diff
changeset
|
55 st:text_tag("first", data); |
7836
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 end; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
58 before = function(st, data) |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
59 if data == true then |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
60 st:tag("before"):up(); |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
61 else |
11426
c7948491c5e4
util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents:
10764
diff
changeset
|
62 st:text_tag("before", data); |
7836
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 end |
10763
e0e2ae050d65
util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents:
10761
diff
changeset
|
64 end; |
e0e2ae050d65
util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents:
10761
diff
changeset
|
65 max = function (st, data) |
11426
c7948491c5e4
util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents:
10764
diff
changeset
|
66 st:text_tag("max", inttostr(data)); |
10763
e0e2ae050d65
util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents:
10761
diff
changeset
|
67 end; |
11428
d91def9fcfdd
util.rsm: Correctly coerce integer value for <index> (fix #1642)
Kim Alvefur <zash@zash.se>
parents:
11426
diff
changeset
|
68 index = function (st, data) |
d91def9fcfdd
util.rsm: Correctly coerce integer value for <index> (fix #1642)
Kim Alvefur <zash@zash.se>
parents:
11426
diff
changeset
|
69 st:text_tag("index", inttostr(data)); |
d91def9fcfdd
util.rsm: Correctly coerce integer value for <index> (fix #1642)
Kim Alvefur <zash@zash.se>
parents:
11426
diff
changeset
|
70 end; |
10763
e0e2ae050d65
util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents:
10761
diff
changeset
|
71 count = function (st, data) |
11426
c7948491c5e4
util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents:
10764
diff
changeset
|
72 st:text_tag("count", inttostr(data)); |
10763
e0e2ae050d65
util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents:
10761
diff
changeset
|
73 end; |
7836
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 }, { |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 __index = function(_, name) |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 return function(st, data) |
11426
c7948491c5e4
util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents:
10764
diff
changeset
|
77 st:text_tag(name, data); |
7836
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
79 end; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
80 }); |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 local function parse(set) |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 local rs = {}; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 for tag in set:childtags() do |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 local name = tag.name; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 local parser = name and element_parsers[name]; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 if parser then |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 rs[name] = parser(tag); |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 return rs; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
93 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
94 |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
95 local function generate(t) |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 local st = stanza("set", { xmlns = xmlns_rsm }); |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
97 for k,v in pairs(t) do |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 if element_parsers[k] then |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 element_generators[k](st, v); |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 return st; |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
104 |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
105 local function get(st) |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 local set = st:get_child("set", xmlns_rsm); |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 if set and #set.tags > 0 then |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 return parse(set); |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 end |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
111 |
30fac9154fd4
mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
112 return { parse = parse, generate = generate, get = get }; |