179 module:log("warn", "::%s", tostring(queue[i])); |
179 module:log("warn", "::%s", tostring(queue[i])); |
180 end |
180 end |
181 handle_unacked_stanzas(session); |
181 handle_unacked_stanzas(session); |
182 end |
182 end |
183 else |
183 else |
|
184 session.log("debug", "mod_smacks hibernating session for up to %d seconds", resume_timeout); |
184 local hibernate_time = os_time(); -- Track the time we went into hibernation |
185 local hibernate_time = os_time(); -- Track the time we went into hibernation |
185 session.hibernating = hibernate_time; |
186 session.hibernating = hibernate_time; |
186 local resumption_token = session.resumption_token; |
187 local resumption_token = session.resumption_token; |
187 timer.add_task(resume_timeout, function () |
188 timer.add_task(resume_timeout, function () |
|
189 session.log("debug", "mod_smacks hibernation timeout reached..."); |
188 -- We need to check the current resumption token for this resource |
190 -- We need to check the current resumption token for this resource |
189 -- matches the smacks session this timer is for in case it changed |
191 -- matches the smacks session this timer is for in case it changed |
190 -- (for example, the client may have bound a new resource and |
192 -- (for example, the client may have bound a new resource and |
191 -- started a new smacks session, or not be using smacks) |
193 -- started a new smacks session, or not be using smacks) |
192 local curr_session = hosts[session.host].sessions[session.username].sessions[session.resource]; |
194 local curr_session = hosts[session.host].sessions[session.username].sessions[session.resource]; |
193 if curr_session.resumption_token == resumption_token |
195 if curr_session.resumption_token == resumption_token |
194 -- Check the hibernate time still matches what we think it is, |
196 -- Check the hibernate time still matches what we think it is, |
195 -- otherwise the session resumed and re-hibernated. |
197 -- otherwise the session resumed and re-hibernated. |
196 and session.hibernating == hibernate_time then |
198 and session.hibernating == hibernate_time then |
|
199 session.log("debug", "Destroying session for hibernating too long"); |
197 session_registry[session.resumption_token] = nil; |
200 session_registry[session.resumption_token] = nil; |
198 session.resumption_token = nil; |
201 session.resumption_token = nil; |
199 -- This recursion back into our destroy handler is to |
202 -- This recursion back into our destroy handler is to |
200 -- make sure we still handle any queued stanzas |
203 -- make sure we still handle any queued stanzas |
201 sessionmanager.destroy_session(session); |
204 sessionmanager.destroy_session(session); |
|
205 else |
|
206 session.log("debug", "Session resumed before hibernation timeout, all is well") |
202 end |
207 end |
203 end); |
208 end); |
204 return; -- Postpone destruction for now |
209 return; -- Postpone destruction for now |
205 end |
210 end |
206 |
211 |