Software /
code /
verse
Comparison
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 |
comparison
equal
deleted
inserted
replaced
449:c720f331327c | 450:e72deac76e0e |
---|---|
3 | 3 |
4 local xmlns_sm = "urn:xmpp:sm:3"; | 4 local xmlns_sm = "urn:xmpp:sm:3"; |
5 | 5 |
6 function verse.plugins.smacks(stream) | 6 function verse.plugins.smacks(stream) |
7 -- State for outgoing stanzas | 7 -- State for outgoing stanzas |
8 local outgoing_queue = {}; | 8 local outgoing_queue = nil; |
9 local last_ack = 0; | 9 local last_ack = nil; |
10 local last_stanza_time = now(); | 10 local last_stanza_time = nil; |
11 local timer_active; | 11 local timer_active; |
12 | 12 |
13 -- State for incoming stanzas | 13 -- State for incoming stanzas |
14 local handled_stanza_count = 0; | 14 local handled_stanza_count = nil; |
15 | 15 |
16 -- Catch incoming stanzas | 16 -- Catch incoming stanzas |
17 local function incoming_stanza(stanza) | 17 local function incoming_stanza(stanza) |
18 if stream.smacks and (stanza.attr.xmlns == "jabber:client" or not stanza.attr.xmlns) then | 18 if handled_stanza_count and (stanza.attr.xmlns == "jabber:client" or not stanza.attr.xmlns) then |
19 handled_stanza_count = handled_stanza_count + 1; | 19 handled_stanza_count = handled_stanza_count + 1; |
20 stream:debug("Increasing handled stanzas to %d for %s", handled_stanza_count, stanza:top_tag()); | 20 stream:debug("Increasing handled stanzas to %d for %s", handled_stanza_count, stanza:top_tag()); |
21 end | 21 end |
22 end | 22 end |
23 | 23 |
24 -- Catch outgoing stanzas | 24 -- Catch outgoing stanzas |
25 local function outgoing_stanza(stanza) | 25 local function outgoing_stanza(stanza) |
26 -- NOTE: This will not behave nice if stanzas are serialized before this point | 26 -- NOTE: This will not behave nice if stanzas are serialized before this point |
27 if stream.smacks and (stanza.name and not stanza.attr.xmlns) then | 27 if outgoing_queue and (stanza.name and not stanza.attr.xmlns) then |
28 -- serialize stanzas in order to bypass this on resumption | 28 -- serialize stanzas in order to bypass this on resumption |
29 outgoing_queue[#outgoing_queue+1] = tostring(stanza); | 29 outgoing_queue[#outgoing_queue+1] = tostring(stanza); |
30 last_stanza_time = now(); | 30 last_stanza_time = now(); |
31 if not timer_active then | 31 if not timer_active then |
32 timer_active = true; | 32 timer_active = true; |
81 last_ack = new_ack; | 81 last_ack = new_ack; |
82 elseif new_ack < last_ack then | 82 elseif new_ack < last_ack then |
83 stream:warn("Received bad ack for "..new_ack.." when last ack was "..last_ack); | 83 stream:warn("Received bad ack for "..new_ack.." when last ack was "..last_ack); |
84 end | 84 end |
85 elseif stanza.name == "enabled" then | 85 elseif stanza.name == "enabled" then |
86 handled_stanza_count = 0; | |
86 stream.pre_smacks_features = nil; | 87 stream.pre_smacks_features = nil; |
87 | 88 |
88 if stanza.attr.id then | 89 if stanza.attr.id then |
89 stream.resumption_token = stanza.attr.id; | 90 stream.resumption_token = stanza.attr.id; |
90 end | 91 end |
106 stream:debug("Resumed successfully"); | 107 stream:debug("Resumed successfully"); |
107 stream:event("resumed"); | 108 stream:event("resumed"); |
108 elseif stanza.name == "failed" then | 109 elseif stanza.name == "failed" then |
109 stream.bound = nil | 110 stream.bound = nil |
110 stream.smacks = nil | 111 stream.smacks = nil |
111 last_ack = 0 | 112 last_ack = nil |
112 handled_stanza_count = 0; | 113 handled_stanza_count = nil |
113 | 114 |
114 -- TODO ack using final h value from <failed/> if present | 115 -- TODO ack using final h value from <failed/> if present |
115 outgoing_queue = {}; -- TODO fire some delivery failures | 116 outgoing_queue = {}; -- TODO fire some delivery failures |
116 | 117 |
117 local features = stream.pre_smacks_features; | 118 local features = stream.pre_smacks_features; |
126 | 127 |
127 local function on_bind_success() | 128 local function on_bind_success() |
128 if stream.stream_management_supported and not stream.smacks then | 129 if stream.stream_management_supported and not stream.smacks then |
129 --stream:unhook("bind-success", on_bind_success); | 130 --stream:unhook("bind-success", on_bind_success); |
130 stream:debug("smacks: sending enable"); | 131 stream:debug("smacks: sending enable"); |
132 outgoing_queue = {}; | |
133 last_ack = 0; | |
134 last_stanza_time = now(); | |
131 stream:send(verse.stanza("enable", { xmlns = xmlns_sm, resume = "true" })); | 135 stream:send(verse.stanza("enable", { xmlns = xmlns_sm, resume = "true" })); |
132 stream.smacks = true; | 136 stream.smacks = true; |
133 end | 137 end |
134 end | 138 end |
135 | 139 |