mod_smacks/mod_smacks.lua
changeset 255 9b9b089407b1
parent 220 263858d40ceb
child 256 57de4a7840ef
equal deleted inserted replaced
254:9b4a114b2fe6 255:9b9b089407b1
    28 			
    28 			
    29 			-- Overwrite process_stanza() and send()
    29 			-- Overwrite process_stanza() and send()
    30 			local queue = {};
    30 			local queue = {};
    31 			session.outgoing_stanza_queue = queue;
    31 			session.outgoing_stanza_queue = queue;
    32 			session.last_acknowledged_stanza = 0;
    32 			session.last_acknowledged_stanza = 0;
    33 			local _send = session.send;
    33 			local _send = session.sends2s or session.send;
    34 			function session.send(stanza)
    34 			local function new_send(stanza)
    35 				local attr = stanza.attr;
    35 				local attr = stanza.attr;
    36 				if attr and not attr.xmlns then -- Stanza in default stream namespace
    36 				if attr and not attr.xmlns then -- Stanza in default stream namespace
    37 					queue[#queue+1] = st.reply(stanza);
    37 					queue[#queue+1] = st.reply(stanza);
    38 				end
    38 				end
    39 				local ok, err = _send(stanza);
    39 				local ok, err = _send(stanza);
    40 				if ok and #queue > max_unacked_stanzas and not session.awaiting_ack then
    40 				if ok and #queue > max_unacked_stanzas and not session.awaiting_ack then
    41 					session.awaiting_ack = true;
    41 					session.awaiting_ack = true;
    42 					return _send(st.stanza("r", { xmlns = xmlns_sm }));
    42 					return _send(st.stanza("r", { xmlns = xmlns_sm }));
    43 				end
    43 				end
    44 				return ok, err;
    44 				return ok, err;
       
    45 			end
       
    46 			
       
    47 			if session.sends2s then
       
    48 				session.sends2s = new_send;
       
    49 			else
       
    50 				session.send = new_send;
    45 			end
    51 			end
    46 			
    52 			
    47 			session.handled_stanza_count = 0;
    53 			session.handled_stanza_count = 0;
    48 			add_filter(session, "stanzas/in", function (stanza)
    54 			add_filter(session, "stanzas/in", function (stanza)
    49 				if not stanza.attr.xmlns then
    55 				if not stanza.attr.xmlns then
    64 		module:log("debug", "Received ack request from non-smack-enabled session");
    70 		module:log("debug", "Received ack request from non-smack-enabled session");
    65 		return;
    71 		return;
    66 	end
    72 	end
    67 	module:log("debug", "Received ack request, acking for %d", origin.handled_stanza_count);
    73 	module:log("debug", "Received ack request, acking for %d", origin.handled_stanza_count);
    68 	-- Reply with <a>
    74 	-- Reply with <a>
    69 	origin.send(st.stanza("a", { xmlns = xmlns_sm, h = tostring(origin.handled_stanza_count) }));
    75 	(origin.sends2s or origin.send)(st.stanza("a", { xmlns = xmlns_sm, h = tostring(origin.handled_stanza_count) }));
    70 	return true;
    76 	return true;
    71 end);
    77 end);
    72 
    78 
    73 module:hook_stanza(xmlns_sm, "a", function (origin, stanza)
    79 module:hook_stanza(xmlns_sm, "a", function (origin, stanza)
    74 	if not origin.smacks then return; end
    80 	if not origin.smacks then return; end