Software / code / prosody
Comparison
plugins/mod_csi_simple.lua @ 10806:24e2b571d29a
mod_csi_simple: Refactor to allow logging reason for buffer flush
Same style as mod_mam and mod_carbons allows easy comparison.
BC: Log format changes
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 07 May 2020 21:55:29 +0200 |
| parent | 10801:2b97aac0ea3c |
| child | 10807:b92afa0a4119 |
comparison
equal
deleted
inserted
replaced
| 10805:d17392022cb2 | 10806:24e2b571d29a |
|---|---|
| 13 | 13 |
| 14 local queue_size = module:get_option_number("csi_queue_size", 256); | 14 local queue_size = module:get_option_number("csi_queue_size", 256); |
| 15 | 15 |
| 16 local important_payloads = module:get_option_set("csi_important_payloads", { }); | 16 local important_payloads = module:get_option_set("csi_important_payloads", { }); |
| 17 | 17 |
| 18 module:hook("csi-is-stanza-important", function (event) | 18 function is_important(stanza) --> boolean, reason: string |
| 19 local stanza = event.stanza; | |
| 20 if not st.is_stanza(stanza) then | 19 if not st.is_stanza(stanza) then |
| 21 -- whitespace pings etc | 20 -- whitespace pings etc |
| 22 return true; | 21 return true; |
| 23 end | 22 end |
| 24 if stanza.attr.xmlns ~= nil then | 23 if stanza.attr.xmlns ~= nil then |
| 67 end | 66 end |
| 68 return false; | 67 return false; |
| 69 elseif st_name == "iq" then | 68 elseif st_name == "iq" then |
| 70 return true; | 69 return true; |
| 71 end | 70 end |
| 71 end | |
| 72 | |
| 73 module:hook("csi-is-stanza-important", function (event) | |
| 74 local important, why = is_important(event.stanza); | |
| 75 event.reason = why; | |
| 76 return important; | |
| 72 end, -1); | 77 end, -1); |
| 78 | |
| 79 local function should_flush(stanza, session, ctr) --> boolean, reason: string | |
| 80 if ctr >= queue_size then | |
| 81 return true, "queue size limit reached"; | |
| 82 end | |
| 83 local event = { stanza = stanza, session = session }; | |
| 84 local ret = module:fire_event("csi-is-stanza-important", event) | |
| 85 return ret, event.reason; | |
| 86 end | |
| 73 | 87 |
| 74 local function with_timestamp(stanza, from) | 88 local function with_timestamp(stanza, from) |
| 75 if st.is_stanza(stanza) and stanza.attr.xmlns == nil and stanza.name ~= "iq" then | 89 if st.is_stanza(stanza) and stanza.attr.xmlns == nil and stanza.name ~= "iq" then |
| 76 stanza = st.clone(stanza); | 90 stanza = st.clone(stanza); |
| 77 stanza:add_direct_child(st.stanza("delay", {xmlns = "urn:xmpp:delay", from = from, stamp = dt.datetime()})); | 91 stanza:add_direct_child(st.stanza("delay", {xmlns = "urn:xmpp:delay", from = from, stamp = dt.datetime()})); |
| 79 return stanza; | 93 return stanza; |
| 80 end | 94 end |
| 81 | 95 |
| 82 local function manage_buffer(stanza, session) | 96 local function manage_buffer(stanza, session) |
| 83 local ctr = session.csi_counter or 0; | 97 local ctr = session.csi_counter or 0; |
| 84 if ctr >= queue_size then | 98 local flush, why = should_flush(stanza, session, ctr); |
| 85 session.log("debug", "Queue size limit hit, flushing buffer (queue size is %d)", session.csi_counter); | 99 if flush then |
| 86 session.conn:resume_writes(); | 100 session.log("debug", "Flushing buffer (%s; queue size is %d)", why or "important", session.csi_counter); |
| 87 elseif module:fire_event("csi-is-stanza-important", { stanza = stanza, session = session }) then | |
| 88 session.log("debug", "Important stanza, flushing buffer (queue size is %d)", session.csi_counter); | |
| 89 session.conn:resume_writes(); | 101 session.conn:resume_writes(); |
| 90 else | 102 else |
| 91 stanza = with_timestamp(stanza, jid.join(session.username, session.host)) | 103 stanza = with_timestamp(stanza, jid.join(session.username, session.host)) |
| 92 end | 104 end |
| 93 session.csi_counter = ctr + 1; | 105 session.csi_counter = ctr + 1; |