plugins/mod_smacks.lua
changeset 12523 d935af51c644
parent 12522 73ee3855f970
child 12527 d2177cb5a766
equal deleted inserted replaced
12522:73ee3855f970 12523:d935af51c644
   300 		return true;
   300 		return true;
   301 	end
   301 	end
   302 
   302 
   303 	if session.username then
   303 	if session.username then
   304 		local old_sessions, err = all_old_sessions:get(session.username);
   304 		local old_sessions, err = all_old_sessions:get(session.username);
   305 		module:log("debug", "Old sessions: %q", old_sessions)
   305 		session.log("debug", "Old sessions: %q", old_sessions)
   306 		if old_sessions then
   306 		if old_sessions then
   307 			local keep, count = {}, 0;
   307 			local keep, count = {}, 0;
   308 			for token, info in it.sorted_pairs(old_sessions, function(a, b)
   308 			for token, info in it.sorted_pairs(old_sessions, function(a, b)
   309 				return (old_sessions[a].t or 0) > (old_sessions[b].t or 0);
   309 				return (old_sessions[a].t or 0) > (old_sessions[b].t or 0);
   310 			end) do
   310 			end) do
   312 				if count > max_old_sessions then break end
   312 				if count > max_old_sessions then break end
   313 				keep[token] = info;
   313 				keep[token] = info;
   314 			end
   314 			end
   315 			all_old_sessions:set(session.username, keep);
   315 			all_old_sessions:set(session.username, keep);
   316 		elseif err then
   316 		elseif err then
   317 			module:log("error", "Unable to retrieve old resumption counters: %s", err);
   317 			session.log("error", "Unable to retrieve old resumption counters: %s", err);
   318 		end
   318 		end
   319 	end
   319 	end
   320 
   320 
   321 	module:log("debug", "Enabling stream management");
   321 	session.log("debug", "Enabling stream management");
   322 	session.smacks = xmlns_sm;
   322 	session.smacks = xmlns_sm;
   323 
   323 
   324 	wrap_session(session, false);
   324 	wrap_session(session, false);
   325 
   325 
   326 	local resume_max;
   326 	local resume_max;
   351 	wrap_session_out(session, false);
   351 	wrap_session_out(session, false);
   352 	session.sends2s(st.stanza("enable", { xmlns = session.smacks }));
   352 	session.sends2s(st.stanza("enable", { xmlns = session.smacks }));
   353 end);
   353 end);
   354 
   354 
   355 function handle_enabled(session, stanza, xmlns_sm) -- luacheck: ignore 212/stanza
   355 function handle_enabled(session, stanza, xmlns_sm) -- luacheck: ignore 212/stanza
   356 	module:log("debug", "Enabling stream management");
   356 	session.log("debug", "Enabling stream management");
   357 	session.smacks = xmlns_sm;
   357 	session.smacks = xmlns_sm;
   358 
   358 
   359 	wrap_session_in(session, false);
   359 	wrap_session_in(session, false);
   360 
   360 
   361 	-- FIXME Resume?
   361 	-- FIXME Resume?
   365 module:hook_tag(xmlns_sm2, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm2); end, 100);
   365 module:hook_tag(xmlns_sm2, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm2); end, 100);
   366 module:hook_tag(xmlns_sm3, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm3); end, 100);
   366 module:hook_tag(xmlns_sm3, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm3); end, 100);
   367 
   367 
   368 function handle_r(origin, stanza, xmlns_sm) -- luacheck: ignore 212/stanza
   368 function handle_r(origin, stanza, xmlns_sm) -- luacheck: ignore 212/stanza
   369 	if not origin.smacks then
   369 	if not origin.smacks then
   370 		module:log("debug", "Received ack request from non-smack-enabled session");
   370 		origin.log("debug", "Received ack request from non-smack-enabled session");
   371 		return;
   371 		return;
   372 	end
   372 	end
   373 	module:log("debug", "Received ack request, acking for %d", origin.handled_stanza_count);
   373 	origin.log("debug", "Received ack request, acking for %d", origin.handled_stanza_count);
   374 	-- Reply with <a>
   374 	-- Reply with <a>
   375 	(origin.sends2s or origin.send)(st.stanza("a", { xmlns = xmlns_sm, h = format_h(origin.handled_stanza_count) }));
   375 	(origin.sends2s or origin.send)(st.stanza("a", { xmlns = xmlns_sm, h = format_h(origin.handled_stanza_count) }));
   376 	-- piggyback our own ack request if needed (see request_ack_if_needed() for explanation of last_requested_h)
   376 	-- piggyback our own ack request if needed (see request_ack_if_needed() for explanation of last_requested_h)
   377 	request_ack_now_if_needed(origin, false, "piggybacked by handle_r", nil);
   377 	request_ack_now_if_needed(origin, false, "piggybacked by handle_r", nil);
   378 	return true;
   378 	return true;