comparison mod_smacks/mod_smacks.lua @ 257:08fa42e1ab06

mod_smacks: Fixes for monkey-patched sessionmanager.destroy to handle stream resumption, and to fall back to stock destroy() if the session is not smacks-enabled.
author Matthew Wild <mwild1@gmail.com>
date Thu, 07 Oct 2010 16:18:07 +0100
parents 57de4a7840ef
children 36648205b10a
comparison
equal deleted inserted replaced
256:57de4a7840ef 257:08fa42e1ab06
2 2
3 local t_insert, t_remove = table.insert, table.remove; 3 local t_insert, t_remove = table.insert, table.remove;
4 local math_min = math.min; 4 local math_min = math.min;
5 local tonumber, tostring = tonumber, tostring; 5 local tonumber, tostring = tonumber, tostring;
6 local add_filter = require "util.filters".add_filter; 6 local add_filter = require "util.filters".add_filter;
7 local timer = require "util.timer";
7 8
8 local xmlns_sm = "urn:xmpp:sm:2"; 9 local xmlns_sm = "urn:xmpp:sm:2";
9 10
10 local sm_attr = { xmlns = xmlns_sm }; 11 local sm_attr = { xmlns = xmlns_sm };
11 12
13 local resume_timeout = 300;
12 local max_unacked_stanzas = 0; 14 local max_unacked_stanzas = 0;
13 15
14 module:add_event_hook("stream-features", 16 module:add_event_hook("stream-features",
15 function (session, features) 17 function (session, features)
16 features:tag("sm", sm_attr):tag("optional"):up():up(); 18 features:tag("sm", sm_attr):tag("optional"):up():up();
119 end 121 end
120 122
121 local _destroy_session = sessionmanager.destroy_session; 123 local _destroy_session = sessionmanager.destroy_session;
122 function sessionmanager.destroy_session(session, err) 124 function sessionmanager.destroy_session(session, err)
123 if session.smacks then 125 if session.smacks then
124 local queue = session.outgoing_stanza_queue; 126 if not session.resumption_token then
125 if #queue > 0 then 127 local queue = session.outgoing_stanza_queue;
126 module:log("warn", "Destroying session with %d unacked stanzas:", #queue); 128 if #queue > 0 then
127 for i=1,#queue do 129 module:log("warn", "Destroying session with %d unacked stanzas:", #queue);
128 module:log("warn", "::%s", tostring(queue[i])); 130 for i=1,#queue do
131 module:log("warn", "::%s", tostring(queue[i]));
132 end
133 handle_unacked_stanzas(session);
129 end 134 end
130 handle_unacked_stanzas(session); 135 else
136 session.hibernating = true;
137 timer.add_task(resume_timeout, function ()
138 if session.hibernating then
139 session.resumption_token = nil;
140 sessionmanager.destroy_session(session); -- Re-destroy
141 end
142 end);
143 return; -- Postpone destruction for now
131 end 144 end
132 end 145 end
133 return _destroy_session(session, err); 146 return _destroy_session(session, err);
134 end 147 end