Mercurial > prosody-modules
comparison 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 |
comparison
equal
deleted
inserted
replaced
3106:1fe7da46e915 | 3107:f703cc6e72df |
---|---|
17 local uuid_generate = require "util.uuid".generate; | 17 local uuid_generate = require "util.uuid".generate; |
18 local jid = require "util.jid"; | 18 local jid = require "util.jid"; |
19 | 19 |
20 local t_insert, t_remove = table.insert, table.remove; | 20 local t_insert, t_remove = table.insert, table.remove; |
21 local math_min = math.min; | 21 local math_min = math.min; |
22 local math_max = math.max; | |
22 local os_time = os.time; | 23 local os_time = os.time; |
23 local tonumber, tostring = tonumber, tostring; | 24 local tonumber, tostring = tonumber, tostring; |
24 local add_filter = require "util.filters".add_filter; | 25 local add_filter = require "util.filters".add_filter; |
25 local timer = require "util.timer"; | 26 local timer = require "util.timer"; |
26 local datetime = require "util.datetime"; | 27 local datetime = require "util.datetime"; |
413 session.log("debug", "The session has already been destroyed"); | 414 session.log("debug", "The session has already been destroyed"); |
414 elseif curr_session and curr_session.resumption_token == resumption_token | 415 elseif curr_session and curr_session.resumption_token == resumption_token |
415 -- Check the hibernate time still matches what we think it is, | 416 -- Check the hibernate time still matches what we think it is, |
416 -- otherwise the session resumed and re-hibernated. | 417 -- otherwise the session resumed and re-hibernated. |
417 and session.hibernating == hibernate_time then | 418 and session.hibernating == hibernate_time then |
419 -- wait longer if the timeout isn't reached because push was enabled for this session | |
420 -- session.first_hibernated_push is the starting point for hibernation timeouts of those push enabled clients | |
421 -- wait for an additional resume_timeout seconds if no push occured since hibernation at all | |
422 local current_time = os_time(); | |
423 local timeout_start = math_max(session.hibernating, session.first_hibernated_push or session.hibernating); | |
424 if session.push_identifier ~= nil and not session.first_hibernated_push then | |
425 session.log("debug", "No push happened since hibernation started, hibernating session for up to %d extra seconds", resume_timeout); | |
426 return resume_timeout; | |
427 end | |
428 if current_time-timeout_start < resume_timeout and session.push_identifier ~= nil then | |
429 session.log("debug", "A push happened since hibernation started, hibernating session for up to %d extra seconds", current_time-timeout_start); | |
430 return current_time-timeout_start; -- time left to wait | |
431 end | |
418 session.log("debug", "Destroying session for hibernating too long"); | 432 session.log("debug", "Destroying session for hibernating too long"); |
419 session_registry.set(session.username, session.resumption_token, nil); | 433 session_registry.set(session.username, session.resumption_token, nil); |
420 -- save only actual h value and username/host (for security) | 434 -- save only actual h value and username/host (for security) |
421 old_session_registry.set(session.username, session.resumption_token, { | 435 old_session_registry.set(session.username, session.resumption_token, { |
422 h = session.handled_stanza_count, | 436 h = session.handled_stanza_count, |