Diff

plugins/smacks.lua @ 450:e72deac76e0e

plugins.smacks: Change to track enabled state per direction Counting outgoing stanzas should start after <enable> is sent, while counting incoming stanzas should star after receiving <enabled/> This should also help with failed resumptions
author Kim Alvefur <zash@zash.se>
date Sat, 19 Feb 2022 15:57:24 +0100
parent 449:c720f331327c
line wrap: on
line diff
--- a/plugins/smacks.lua	Sat Feb 19 15:52:10 2022 +0100
+++ b/plugins/smacks.lua	Sat Feb 19 15:57:24 2022 +0100
@@ -5,17 +5,17 @@
 
 function verse.plugins.smacks(stream)
 	-- State for outgoing stanzas
-	local outgoing_queue = {};
-	local last_ack = 0;
-	local last_stanza_time = now();
+	local outgoing_queue = nil;
+	local last_ack = nil;
+	local last_stanza_time = nil;
 	local timer_active;
 
 	-- State for incoming stanzas
-	local handled_stanza_count = 0;
+	local handled_stanza_count = nil;
 
 	-- Catch incoming stanzas
 	local function incoming_stanza(stanza)
-		if stream.smacks and (stanza.attr.xmlns == "jabber:client" or not stanza.attr.xmlns) then
+		if handled_stanza_count and (stanza.attr.xmlns == "jabber:client" or not stanza.attr.xmlns) then
 			handled_stanza_count = handled_stanza_count + 1;
 			stream:debug("Increasing handled stanzas to %d for %s", handled_stanza_count, stanza:top_tag());
 		end
@@ -24,7 +24,7 @@
 	-- Catch outgoing stanzas
 	local function outgoing_stanza(stanza)
 		-- NOTE: This will not behave nice if stanzas are serialized before this point
-		if stream.smacks and (stanza.name and not stanza.attr.xmlns) then
+		if outgoing_queue and (stanza.name and not stanza.attr.xmlns) then
 			-- serialize stanzas in order to bypass this on resumption
 			outgoing_queue[#outgoing_queue+1] = tostring(stanza);
 			last_stanza_time = now();
@@ -83,6 +83,7 @@
 				stream:warn("Received bad ack for "..new_ack.." when last ack was "..last_ack);
 			end
 		elseif stanza.name == "enabled" then
+			handled_stanza_count = 0;
 			stream.pre_smacks_features = nil;
 
 			if stanza.attr.id then
@@ -108,8 +109,8 @@
 		elseif stanza.name == "failed" then
 			stream.bound = nil
 			stream.smacks = nil
-			last_ack = 0
-			handled_stanza_count = 0;
+			last_ack = nil
+			handled_stanza_count = nil
 
 			-- TODO ack using final h value from <failed/> if present
 			outgoing_queue = {}; -- TODO fire some delivery failures
@@ -128,6 +129,9 @@
 		if stream.stream_management_supported and not stream.smacks then
 			--stream:unhook("bind-success", on_bind_success);
 			stream:debug("smacks: sending enable");
+			outgoing_queue = {};
+			last_ack = 0;
+			last_stanza_time = now();
 			stream:send(verse.stanza("enable", { xmlns = xmlns_sm, resume = "true" }));
 			stream.smacks = true;
 		end