# HG changeset patch # User Kim Alvefur # Date 1645282644 -3600 # Node ID e72deac76e0e169263727615cd0bf9361000c29c # Parent c720f331327c4f4fcbbbc4e54d73d4a55261458d plugins.smacks: Change to track enabled state per direction Counting outgoing stanzas should start after is sent, while counting incoming stanzas should star after receiving This should also help with failed resumptions diff -r c720f331327c -r e72deac76e0e plugins/smacks.lua --- 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 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