comparison mod_smacks/mod_smacks.lua @ 3620:fb1c8dee2ead

mod_smacks: piggyback ack request onto ack response if queue is not empty, use native stoppable timers if supported
author tmolitor <thilo@eightysoft.de>
date Sat, 15 Jun 2019 01:34:52 +0200
parents 3d4eefdd950a
children c2c851722a8a
comparison
equal deleted inserted replaced
3619:74aa35aeb08a 3620:fb1c8dee2ead
102 return true; -- allow session to be removed from full cache to make room for new one 102 return true; -- allow session to be removed from full cache to make room for new one
103 end); 103 end);
104 104
105 local function stoppable_timer(delay, callback) 105 local function stoppable_timer(delay, callback)
106 local stopped = false; 106 local stopped = false;
107 local timer = module:add_timer(delay, function (t)
108 if stopped then return; end
109 return callback(t);
110 end);
111 if timer.stop then return timer; end -- new prosody api includes stop() function
107 return { 112 return {
108 stop = function () stopped = true end; 113 stop = function () stopped = true end;
109 module:add_timer(delay, function (t) 114 timer;
110 if stopped then return; end
111 return callback(t);
112 end);
113 }; 115 };
114 end 116 end
115 117
116 local function delayed_ack_function(session) 118 local function delayed_ack_function(session)
117 -- fire event only if configured to do so and our session is not hibernated or destroyed 119 -- fire event only if configured to do so and our session is not hibernated or destroyed
205 end 207 end
206 208
207 queue[#queue+1] = cached_stanza; 209 queue[#queue+1] = cached_stanza;
208 if session.hibernating then 210 if session.hibernating then
209 session.log("debug", "hibernating, stanza queued"); 211 session.log("debug", "hibernating, stanza queued");
212 module:fire_event("smacks-hibernation-stanza-queued", {origin = session, queue = queue, stanza = cached_stanza});
210 return nil; 213 return nil;
211 end 214 end
212 request_ack_if_needed(session, false, "outgoing_stanza_filter"); 215 request_ack_if_needed(session, false, "outgoing_stanza_filter");
213 end 216 end
214 return stanza; 217 return stanza;
324 return; 327 return;
325 end 328 end
326 module:log("debug", "Received ack request, acking for %d", origin.handled_stanza_count); 329 module:log("debug", "Received ack request, acking for %d", origin.handled_stanza_count);
327 -- Reply with <a> 330 -- Reply with <a>
328 (origin.sends2s or origin.send)(st.stanza("a", { xmlns = xmlns_sm, h = string.format("%d", origin.handled_stanza_count) })); 331 (origin.sends2s or origin.send)(st.stanza("a", { xmlns = xmlns_sm, h = string.format("%d", origin.handled_stanza_count) }));
332 -- piggyback our own ack request
333 if #origin.outgoing_stanza_queue > 0 and origin.last_queue_count ~= #origin.outgoing_stanza_queue then
334 request_ack_if_needed(origin, true, "piggybacked by handle_r");
335 end
329 return true; 336 return true;
330 end 337 end
331 module:hook_stanza(xmlns_sm2, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm2); end); 338 module:hook_stanza(xmlns_sm2, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm2); end);
332 module:hook_stanza(xmlns_sm3, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm3); end); 339 module:hook_stanza(xmlns_sm3, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm3); end);
333 340