mod_smacks/mod_smacks.lua
changeset 3624 fb1c8dee2ead
parent 3497 3d4eefdd950a
child 3625 c2c851722a8a
equal deleted inserted replaced
3623:74aa35aeb08a 3624: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