Mercurial > prosody-modules
diff mod_smacks/mod_smacks.lua @ 3107:f703cc6e72df
mod_smacks: defer timeouts for push enabled clients
author | tmolitor <thilo@eightysoft.de> |
---|---|
date | Fri, 08 Jun 2018 17:38:24 +0200 |
parents | 626d2c781c66 |
children | 06e07b483805 |
line wrap: on
line diff
--- a/mod_smacks/mod_smacks.lua Fri Jun 08 15:25:27 2018 +0200 +++ b/mod_smacks/mod_smacks.lua Fri Jun 08 17:38:24 2018 +0200 @@ -19,6 +19,7 @@ local t_insert, t_remove = table.insert, table.remove; local math_min = math.min; +local math_max = math.max; local os_time = os.time; local tonumber, tostring = tonumber, tostring; local add_filter = require "util.filters".add_filter; @@ -415,6 +416,19 @@ -- Check the hibernate time still matches what we think it is, -- otherwise the session resumed and re-hibernated. and session.hibernating == hibernate_time then + -- wait longer if the timeout isn't reached because push was enabled for this session + -- session.first_hibernated_push is the starting point for hibernation timeouts of those push enabled clients + -- wait for an additional resume_timeout seconds if no push occured since hibernation at all + local current_time = os_time(); + local timeout_start = math_max(session.hibernating, session.first_hibernated_push or session.hibernating); + if session.push_identifier ~= nil and not session.first_hibernated_push then + session.log("debug", "No push happened since hibernation started, hibernating session for up to %d extra seconds", resume_timeout); + return resume_timeout; + end + if current_time-timeout_start < resume_timeout and session.push_identifier ~= nil then + session.log("debug", "A push happened since hibernation started, hibernating session for up to %d extra seconds", current_time-timeout_start); + return current_time-timeout_start; -- time left to wait + end session.log("debug", "Destroying session for hibernating too long"); session_registry.set(session.username, session.resumption_token, nil); -- save only actual h value and username/host (for security)