Software /
code /
prosody-modules
Comparison
mod_smacks/mod_smacks.lua @ 2090:1796a022dd29
mod_smacks: Keep timer object around and stop it when needed (trunk only)
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 16 Mar 2016 13:29:28 +0100 |
parent | 2089:964b3d649a36 |
child | 2091:ea95637cf041 |
comparison
equal
deleted
inserted
replaced
2089:964b3d649a36 | 2090:1796a022dd29 |
---|---|
87 session.log("debug", "hibernating, stanza queued"); | 87 session.log("debug", "hibernating, stanza queued"); |
88 return nil; | 88 return nil; |
89 end | 89 end |
90 if #queue > max_unacked_stanzas and not session.awaiting_ack then | 90 if #queue > max_unacked_stanzas and not session.awaiting_ack then |
91 session.log("debug", "Queuing <r> (in a moment)"); | 91 session.log("debug", "Queuing <r> (in a moment)"); |
92 module:add_timer(1e-06, function () | 92 session.awaiting_ack_timer = module:add_timer(1e-06, function () |
93 if not session.awaiting_ack then | 93 if not session.awaiting_ack then |
94 session.awaiting_ack = true; | 94 session.awaiting_ack = true; |
95 session.log("debug", "Sending <r> (after send)"); | 95 session.log("debug", "Sending <r> (after send)"); |
96 (session.sends2s or session.send)(st.stanza("r", { xmlns = session.smacks })) | 96 (session.sends2s or session.send)(st.stanza("r", { xmlns = session.smacks })) |
97 end | 97 end |
214 module:hook_stanza(xmlns_sm3, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm3); end); | 214 module:hook_stanza(xmlns_sm3, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm3); end); |
215 | 215 |
216 function handle_a(origin, stanza) | 216 function handle_a(origin, stanza) |
217 if not origin.smacks then return; end | 217 if not origin.smacks then return; end |
218 origin.awaiting_ack = nil; | 218 origin.awaiting_ack = nil; |
219 if origin.awaiting_ack_timer then | |
220 origin.awaiting_ack_timer:stop(); | |
221 end | |
219 -- Remove handled stanzas from outgoing_stanza_queue | 222 -- Remove handled stanzas from outgoing_stanza_queue |
220 --log("debug", "ACK: h=%s, last=%s", stanza.attr.h or "", origin.last_acknowledged_stanza or ""); | 223 --log("debug", "ACK: h=%s, last=%s", stanza.attr.h or "", origin.last_acknowledged_stanza or ""); |
221 local h = tonumber(stanza.attr.h); | 224 local h = tonumber(stanza.attr.h); |
222 if not h then | 225 if not h then |
223 origin:close{ condition = "invalid-xml"; text = "Missing or invalid 'h' attribute"; }; | 226 origin:close{ condition = "invalid-xml"; text = "Missing or invalid 'h' attribute"; }; |
394 | 397 |
395 local function handle_read_timeout(event) | 398 local function handle_read_timeout(event) |
396 local session = event.session; | 399 local session = event.session; |
397 if session.smacks then | 400 if session.smacks then |
398 if session.awaiting_ack then | 401 if session.awaiting_ack then |
402 if session.awaiting_ack_timer then | |
403 session.awaiting_ack_timer:stop(); | |
404 end | |
399 return false; -- Kick the session | 405 return false; -- Kick the session |
400 end | 406 end |
401 (session.sends2s or session.send)(st.stanza("r", { xmlns = session.smacks })); | 407 (session.sends2s or session.send)(st.stanza("r", { xmlns = session.smacks })); |
402 session.awaiting_ack = true; | 408 session.awaiting_ack = true; |
403 return true; | 409 return true; |