diff -r f43c77c69a8a -r 69248dcd7cff mod_csi_battery_saver/mod_csi_battery_saver.lua --- a/mod_csi_battery_saver/mod_csi_battery_saver.lua Tue Aug 15 21:14:55 2017 +0200 +++ b/mod_csi_battery_saver/mod_csi_battery_saver.lua Thu Aug 17 21:21:23 2017 +0200 @@ -9,7 +9,7 @@ local jid = require "util.jid"; local new_queue = require "util.queue".new; local datetime = require "util.datetime"; -local clone = require "util.stanza".clone; +local st = require "util.stanza"; local xmlns_delay = "urn:xmpp:delay"; @@ -57,7 +57,7 @@ end local push = q.push; function q:push(item) - local ok = push(self, clone(item)); + local ok = push(self, item); if not ok then q:flush(); output(item, self); @@ -95,7 +95,7 @@ local function is_important(stanza, session) local st_name = stanza and stanza.name or nil; - if not st_name then return false; end + if not st_name then return true; end -- nonzas are always important if st_name == "presence" then -- TODO check for MUC status codes? return false; @@ -148,6 +148,7 @@ module:hook("csi-client-inactive", function (event) local session = event.origin; if session.pump then + session.log("debug", "mod_csi_battery_saver(%s): Client is inactive, buffering unimportant stanzas", id); session.pump:pause(); else session.log("debug", "mod_csi_battery_saver(%s): Client is inactive the first time, initializing module for this session", id); @@ -156,19 +157,18 @@ session.pump = pump; session._pump_orig_send = session.send; function session.send(stanza) - session.log("debug", "mod_csi_battery_saver(%s): Got stanza: <%s>", id, tostring(stanza.name)); + session.log("debug", "mod_csi_battery_saver(%s): Got stanza: <%s>", id, tostring(stanza.name or stanza)); local important = is_important(stanza, session); -- add delay stamp to unimportant (buffered) stanzas that can/need be stamped if not important and is_stamp_needed(stanza, session) then stanza = add_stamp(stanza, session); end pump:push(stanza); if important then - session.log("debug", "mod_csi_battery_saver(%s): Encountered important stanza, flushing buffer: <%s>", id, tostring(stanza.name)); + session.log("debug", "mod_csi_battery_saver(%s): Encountered important stanza, flushing buffer: <%s>", id, tostring(stanza.name or stanza)); pump:flush(); end return true; end end - session.log("debug", "mod_csi_battery_saver(%s): Client is inactive, buffering unimportant stanzas", id); end); module:hook("csi-client-active", function (event) @@ -179,17 +179,28 @@ end end); +-- clean up this session +local function remove_pump(session) + if session.pump then + session.log("debug", "mod_csi_battery_saver(%s): Flushing buffer and restoring to original session.send()", id); + session.pump:flush(); + session.send = session._pump_orig_send; + session.pump = nil; + session._pump_orig_send = nil; + end +end + +-- clean up this session on hibernation start +module:hook("smacks-hibernation-start", function (event) + remove_pump(event.origin); +end); + function module.unload() module:log("info", "%s: Unloading module, flushing all buffers", id); local host_sessions = prosody.hosts[module.host].sessions; for _, user in pairs(host_sessions) do for _, session in pairs(user.sessions) do - if session.pump then - session.pump:flush(); - session.send = session._pump_orig_send; - session.pump = nil; - session._pump_orig_send = nil; - end + remove_pump(session); end end end