Mercurial > prosody-modules
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 |