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 |