mod_smacks/mod_smacks.lua
changeset 622 ce39df945de1
parent 600 7693724881b3
child 623 c1f3958695ea
equal deleted inserted replaced
621:7bdd02056e2b 622:ce39df945de1
   196 			end
   196 			end
   197 		end
   197 		end
   198 	end
   198 	end
   199 end
   199 end
   200 
   200 
   201 local _destroy_session = sessionmanager.destroy_session;
   201 module:hook("pre-resource-unbind", function (event)
   202 function sessionmanager.destroy_session(session, err)
   202 	local session, err = event.session, event.error;
   203 	if session.smacks then
   203 	if session.smacks then
   204 		if not session.resumption_token then
   204 		if not session.resumption_token then
   205 			local queue = session.outgoing_stanza_queue;
   205 			local queue = session.outgoing_stanza_queue;
   206 			if #queue > 0 then
   206 			if #queue > 0 then
   207 				module:log("warn", "Destroying session with %d unacked stanzas:", #queue);
   207 				module:log("warn", "Destroying session with %d unacked stanzas:", #queue);
   227 				-- otherwise the session resumed and re-hibernated.
   227 				-- otherwise the session resumed and re-hibernated.
   228 				and session.hibernating == hibernate_time then
   228 				and session.hibernating == hibernate_time then
   229 					session.log("debug", "Destroying session for hibernating too long");
   229 					session.log("debug", "Destroying session for hibernating too long");
   230 					session_registry[session.resumption_token] = nil;
   230 					session_registry[session.resumption_token] = nil;
   231 					session.resumption_token = nil;
   231 					session.resumption_token = nil;
   232 					-- This recursion back into our destroy handler is to
       
   233 					-- make sure we still handle any queued stanzas
       
   234 					sessionmanager.destroy_session(session);
   232 					sessionmanager.destroy_session(session);
   235 				else
   233 				else
   236 					session.log("debug", "Session resumed before hibernation timeout, all is well")
   234 					session.log("debug", "Session resumed before hibernation timeout, all is well")
   237 				end
   235 				end
   238 			end);
   236 			end);
   239 			return; -- Postpone destruction for now
   237 			return true; -- Postpone destruction for now
   240 		end
   238 		end
   241 		
   239 		
   242 	end
   240 	end
   243 	return _destroy_session(session, err);
   241 end);
   244 end
       
   245 
   242 
   246 module:hook_stanza(xmlns_sm, "resume", function (session, stanza)
   243 module:hook_stanza(xmlns_sm, "resume", function (session, stanza)
   247 	local id = stanza.attr.previd;
   244 	local id = stanza.attr.previd;
   248 	local original_session = session_registry[id];
   245 	local original_session = session_registry[id];
   249 	if not original_session then
   246 	if not original_session then