Mercurial > prosody-modules
comparison mod_smacks/mod_smacks.lua @ 201:bc24f58a0d39
mod_smacks: Use filters for catching incoming stanzas (more reliable and efficient), also add some logic to make compatible with the stream resumption module (coming soon)
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 08 Jul 2010 14:01:32 +0100 |
parents | 64a573203c20 |
children | d11478ae374e |
comparison
equal
deleted
inserted
replaced
200:64a573203c20 | 201:bc24f58a0d39 |
---|---|
1 local st = require "util.stanza"; | 1 local st = require "util.stanza"; |
2 | 2 |
3 local t_insert, t_remove = table.insert, table.remove; | 3 local t_insert, t_remove = table.insert, table.remove; |
4 local tonumber, tostring = tonumber, tostring; | 4 local tonumber, tostring = tonumber, tostring; |
5 local add_filter = require "util.filters".add_filter; | |
5 | 6 |
6 local xmlns_sm = "urn:xmpp:sm:2"; | 7 local xmlns_sm = "urn:xmpp:sm:2"; |
7 | 8 |
8 local sm_attr = { xmlns = xmlns_sm }; | 9 local sm_attr = { xmlns = xmlns_sm }; |
9 | 10 |
40 session.awaiting_ack = true; | 41 session.awaiting_ack = true; |
41 return _send(st.stanza("r", { xmlns = xmlns_sm })); | 42 return _send(st.stanza("r", { xmlns = xmlns_sm })); |
42 end | 43 end |
43 return ok, err; | 44 return ok, err; |
44 end | 45 end |
45 _send(st.stanza("enabled", sm_attr)); | 46 |
46 return true; | 47 session.handled_stanza_count = 0; |
47 end); | 48 add_filter(session, "stanzas/in", function (stanza) |
49 if not stanza.attr.xmlns then | |
50 session.handled_stanza_count = session.handled_stanza_count + 1; | |
51 session.log("debug", "Handled %d incoming stanzas", session.handled_stanza_count); | |
52 end | |
53 return stanza; | |
54 end); | |
55 | |
56 if not stanza.attr.resume then -- FIXME: Resumption should be a different spec :/ | |
57 _send(st.stanza("enabled", sm_attr)); | |
58 return true; | |
59 end | |
60 end, 100); | |
48 | 61 |
49 module:hook_stanza(xmlns_sm, "r", function (origin, stanza) | 62 module:hook_stanza(xmlns_sm, "r", function (origin, stanza) |
50 if not origin.smacks then | 63 if not origin.smacks then |
51 module:log("debug", "Received ack request from non-smack-enabled session"); | 64 module:log("debug", "Received ack request from non-smack-enabled session"); |
52 return; | 65 return; |
70 | 83 |
71 --TODO: Optimise... incoming stanzas should be handled by a per-session | 84 --TODO: Optimise... incoming stanzas should be handled by a per-session |
72 -- function that has a counter as an upvalue (no table indexing for increments, | 85 -- function that has a counter as an upvalue (no table indexing for increments, |
73 -- and won't slow non-198 sessions). We can also then remove the .handled flag | 86 -- and won't slow non-198 sessions). We can also then remove the .handled flag |
74 -- on stanzas | 87 -- on stanzas |
75 | |
76 function catch_all_incoming_stanzas(data) | |
77 local origin, stanza = data.origin, data.stanza; | |
78 if origin.smacks and not stanza.handled then | |
79 stanza.handled = true; | |
80 origin.handled_stanza_count = origin.handled_stanza_count + 1; | |
81 module:log("debug", "Handled %d stanzas", origin.handled_stanza_count); | |
82 end | |
83 end | |
84 module:hook("message/bare", catch_all_incoming_stanzas, 1000); | |
85 module:hook("message/full", catch_all_incoming_stanzas, 1000); | |
86 module:hook("message/host", catch_all_incoming_stanzas, 1000); | |
87 | |
88 module:hook("presence/bare", catch_all_incoming_stanzas, 1000); | |
89 module:hook("presence/full", catch_all_incoming_stanzas, 1000); | |
90 module:hook("presence/host", catch_all_incoming_stanzas, 1000); | |
91 | |
92 module:hook("iq/bare", catch_all_incoming_stanzas, 1000); | |
93 module:hook("iq/full", catch_all_incoming_stanzas, 1000); | |
94 module:hook("iq/host", catch_all_incoming_stanzas, 1000); | |
95 | 88 |
96 function handle_unacked_stanzas(session) | 89 function handle_unacked_stanzas(session) |
97 local queue = session.outgoing_stanza_queue; | 90 local queue = session.outgoing_stanza_queue; |
98 local error_attr = { type = "cancel" }; | 91 local error_attr = { type = "cancel" }; |
99 if #queue > 0 then | 92 if #queue > 0 then |