Software / code / verse
Comparison
plugins/smacks.lua @ 350:04049524fcd1
plugins.smacks: Improve logic for sending <r/>
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 27 Aug 2014 10:30:38 +0100 |
| parent | 326:f657ed8f464e |
| child | 380:0891b4e27766 |
comparison
equal
deleted
inserted
replaced
| 349:dfcc5a0f5c79 | 350:04049524fcd1 |
|---|---|
| 1 local verse = require "verse"; | 1 local verse = require "verse"; |
| 2 local now = socket.gettime; | |
| 2 | 3 |
| 3 local xmlns_sm = "urn:xmpp:sm:2"; | 4 local xmlns_sm = "urn:xmpp:sm:2"; |
| 4 | 5 |
| 5 function verse.plugins.smacks(stream) | 6 function verse.plugins.smacks(stream) |
| 6 -- State for outgoing stanzas | 7 -- State for outgoing stanzas |
| 7 local outgoing_queue = {}; | 8 local outgoing_queue = {}; |
| 8 local last_ack = 0; | 9 local last_ack = 0; |
| 10 local last_stanza_time = now(); | |
| 11 local timer_active; | |
| 9 | 12 |
| 10 -- State for incoming stanzas | 13 -- State for incoming stanzas |
| 11 local handled_stanza_count = 0; | 14 local handled_stanza_count = 0; |
| 12 | 15 |
| 13 -- Catch incoming stanzas | 16 -- Catch incoming stanzas |
| 22 function outgoing_stanza(stanza) | 25 function outgoing_stanza(stanza) |
| 23 -- 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 |
| 24 if stanza.name and not stanza.attr.xmlns then | 27 if stanza.name and not stanza.attr.xmlns then |
| 25 -- serialize stanzas in order to bypass this on resumption | 28 -- serialize stanzas in order to bypass this on resumption |
| 26 outgoing_queue[#outgoing_queue+1] = tostring(stanza); | 29 outgoing_queue[#outgoing_queue+1] = tostring(stanza); |
| 27 verse.add_task(1, function() | 30 last_stanza_time = now(); |
| 28 if #outgoing_queue > 0 then | 31 if not timer_active then |
| 32 timer_active = true; | |
| 33 stream:debug("Waiting to send ack request..."); | |
| 34 verse.add_task(1, function() | |
| 35 if #outgoing_queue == 0 then | |
| 36 timer_active = false; | |
| 37 return; | |
| 38 end | |
| 39 local time_since_last_stanza = now() - last_stanza_time; | |
| 40 if time_since_last_stanza < 1 and #outgoing_queue < 10 then | |
| 41 return 1 - time_since_last_stanza; | |
| 42 end | |
| 43 stream:debug("Time up, sending <r>..."); | |
| 44 timer_active = false; | |
| 29 stream:send(verse.stanza("r", { xmlns = xmlns_sm })); | 45 stream:send(verse.stanza("r", { xmlns = xmlns_sm })); |
| 30 end | 46 end); |
| 31 end); | 47 end |
| 32 end | 48 end |
| 33 end | 49 end |
| 34 | 50 |
| 35 local function on_disconnect() | 51 local function on_disconnect() |
| 36 stream:debug("smacks: connection lost"); | 52 stream:debug("smacks: connection lost"); |