plugins/mod_smacks.lua
author Jonas Schäfer <jonas@wielicki.name>
Sun, 26 Dec 2021 22:32:00 +0100
changeset 12127 7ba686696250
parent 12118 e32f90c81519
child 12129 649268c9f603
permissions -rw-r--r--
openmetrics/histograms: fix incorrect condition for bucketing The buckets thresholds are to be taken as "less than or equal to". The condition as written in the code did only "less than", not "less than or equal to". That's fixed now.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- XEP-0198: Stream Management for Prosody IM
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
--
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
-- Copyright (C) 2010-2015 Matthew Wild
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
-- Copyright (C) 2010 Waqas Hussain
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
-- Copyright (C) 2012-2021 Kim Alvefur
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
-- Copyright (C) 2012 Thijs Alkemade
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
-- Copyright (C) 2014 Florian Zeitz
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
-- Copyright (C) 2016-2020 Thilo Molitor
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
--
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
-- This project is MIT/X11 licensed. Please see the
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
-- COPYING file in the source package for more information.
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
--
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
11985
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    14
local tonumber = tonumber;
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    15
local tostring = tostring;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
local os_time = os.time;
11985
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    17
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    18
local datetime = require "util.datetime";
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
local add_filter = require "util.filters".add_filter;
11985
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    20
local jid = require "util.jid";
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    21
local smqueue = require "util.smqueue";
11985
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    22
local st = require "util.stanza";
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
local timer = require "util.timer";
12116
08a949e63541 mod_smacks: Use more compact resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12085
diff changeset
    24
local new_id = require "util.id".short;
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
    25
local watchdog = require "util.watchdog";
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
11985
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    27
local sessionmanager = require "core.sessionmanager";
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    28
local core_process_stanza = prosody.core_process_stanza;
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    29
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    30
local xmlns_errors = "urn:ietf:params:xml:ns:xmpp-stanzas";
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    31
local xmlns_delay = "urn:xmpp:delay";
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
local xmlns_mam2 = "urn:xmpp:mam:2";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
local xmlns_sm2 = "urn:xmpp:sm:2";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
local xmlns_sm3 = "urn:xmpp:sm:3";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
local sm2_attr = { xmlns = xmlns_sm2 };
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
local sm3_attr = { xmlns = xmlns_sm3 };
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    39
local queue_size = module:get_option_number("smacks_max_queue_size", 500);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
local resume_timeout = module:get_option_number("smacks_hibernation_time", 600);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
local s2s_smacks = module:get_option_boolean("smacks_enabled_s2s", true);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
local s2s_resend = module:get_option_boolean("smacks_s2s_resend", false);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
local max_unacked_stanzas = module:get_option_number("smacks_max_unacked_stanzas", 0);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
local max_inactive_unacked_stanzas = module:get_option_number("smacks_max_inactive_unacked_stanzas", 256);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
local delayed_ack_timeout = module:get_option_number("smacks_max_ack_delay", 30);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
local c2s_sessions = module:shared("/*/c2s/sessions");
12067
d308f6901397 mod_smacks: Simplify access to local user sessions
Kim Alvefur <zash@zash.se>
parents: 12066
diff changeset
    48
local local_sessions = prosody.hosts[module.host].sessions;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
11981
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
    50
local function format_h(h) if h then return string.format("%d", h) end end
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
    51
12055
c32ef09ab452 mod_smacks: Persist old counter values to storage
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
    52
local old_session_registry = module:open_store("smacks_h", "map");
12057
03e9587fbfd2 mod_smacks: Switch storage for tracking resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
    53
local session_registry = module:shared "/*/smacks/resumption-tokens"; -- > user@host/resumption-token --> resource
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    55
local ack_errors = require"util.error".init("mod_smacks", xmlns_sm3, {
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    56
	head = { condition = "undefined-condition"; text = "Client acknowledged more stanzas than sent by server" };
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    57
	tail = { condition = "undefined-condition"; text = "Client acknowledged less stanzas than already acknowledged" };
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    58
	pop = { condition = "internal-server-error"; text = "Something went wrong with Stream Management" };
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    59
	overflow = { condition = "resource-constraint", text = "Too many unacked stanzas remaining, session can't be resumed" }
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    60
});
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    61
12080
ad1fe36eaae7 mod_smacks: Fix typo (thanks codespell)
Kim Alvefur <zash@zash.se>
parents: 12079
diff changeset
    62
-- COMPAT note the use of compatibility wrapper in events (queue:table())
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    63
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
    64
local function ack_delayed(session, stanza)
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
	-- fire event only if configured to do so and our session is not already hibernated or destroyed
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
	if delayed_ack_timeout > 0 and session.awaiting_ack
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
	and not session.hibernating and not session.destroyed then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
		session.log("debug", "Firing event 'smacks-ack-delayed', queue = %d",
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    69
			session.outgoing_stanza_queue and session.outgoing_stanza_queue:count_unacked() or 0);
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    70
		module:fire_event("smacks-ack-delayed", {origin = session, queue = session.outgoing_stanza_queue:table(), stanza = stanza});
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    72
	session.delayed_ack_timer = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    73
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
local function can_do_smacks(session, advertise_only)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    76
	if session.smacks then return false, "unexpected-request", "Stream management is already enabled"; end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
	local session_type = session.type;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
	if session.username then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
		if not(advertise_only) and not(session.resource) then -- Fail unless we're only advertising sm
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
			return false, "unexpected-request", "Client must bind a resource before enabling stream management";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
		end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    83
		return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    84
	elseif s2s_smacks and (session_type == "s2sin" or session_type == "s2sout") then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    85
		return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    86
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    87
	return false, "service-unavailable", "Stream management is not available for this stream";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    88
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    89
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    90
module:hook("stream-features",
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    91
		function (event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    92
			if can_do_smacks(event.origin, true) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    93
				event.features:tag("sm", sm2_attr):tag("optional"):up():up();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    94
				event.features:tag("sm", sm3_attr):tag("optional"):up():up();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    95
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    96
		end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    97
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    98
module:hook("s2s-stream-features",
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    99
		function (event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   100
			if can_do_smacks(event.origin, true) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   101
				event.features:tag("sm", sm2_attr):tag("optional"):up():up();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   102
				event.features:tag("sm", sm3_attr):tag("optional"):up():up();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   103
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   104
		end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   105
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   106
local function should_ack(session, force)
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   107
	if not session then return end -- shouldn't be possible
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   108
	if session.destroyed then return end -- gone
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   109
	if not session.smacks then return end -- not using
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   110
	if session.hibernating then return end -- can't ack when asleep
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   111
	if session.awaiting_ack then return end -- already waiting
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   112
	if force then return force end
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   113
	local queue = session.outgoing_stanza_queue;
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   114
	local expected_h = session.last_acknowledged_stanza + queue:count_unacked();
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   115
	local max_unacked = max_unacked_stanzas;
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   116
	if session.state == "inactive" then
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   117
		max_unacked = max_inactive_unacked_stanzas;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   118
	end
12082
2c13aaae35ac mod_smacks: Fix typos
Kim Alvefur <zash@zash.se>
parents: 12081
diff changeset
   119
	-- this check of last_requested_h prevents ack-loops if misbehaving clients report wrong
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   120
	-- stanza counts. it is set when an <r> is really sent (e.g. inside timer), preventing any
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   121
	-- further requests until a higher h-value would be expected.
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   122
	return queue:count_unacked() > max_unacked and expected_h ~= session.last_requested_h;
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   123
end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   124
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   125
local function request_ack(session, reason)
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   126
	local queue = session.outgoing_stanza_queue;
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   127
	session.log("debug", "Sending <r> (inside timer, before send) from %s - #queue=%d", reason, queue:count_unacked());
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   128
	(session.sends2s or session.send)(st.stanza("r", { xmlns = session.smacks }))
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   129
	if session.destroyed then return end -- sending something can trigger destruction
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   130
	session.awaiting_ack = true;
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   131
	-- expected_h could be lower than this expression e.g. more stanzas added to the queue meanwhile)
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   132
	session.last_requested_h = session.last_acknowledged_stanza + queue:count_unacked();
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   133
	session.log("debug", "Sending <r> (inside timer, after send) from %s - #queue=%d", reason, queue:count_unacked());
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   134
	if not session.delayed_ack_timer then
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   135
		session.delayed_ack_timer = timer.add_task(delayed_ack_timeout, function()
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   136
			ack_delayed(session, nil); -- we don't know if this is the only new stanza in the queue
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   137
		end);
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   138
	end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   139
end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   140
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   141
local function request_ack_now_if_needed(session, force, reason)
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   142
	if should_ack(session, force) then
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   143
		request_ack(session, reason);
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   144
	end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   145
end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   146
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   147
local function outgoing_stanza_filter(stanza, session)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   148
	-- XXX: Normally you wouldn't have to check the xmlns for a stanza as it's
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   149
	-- supposed to be nil.
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   150
	-- However, when using mod_smacks with mod_websocket, then mod_websocket's
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   151
	-- stanzas/out filter can get called before this one and adds the xmlns.
12049
a6c821720cb6 mod_smacks: Back out 48f8fa6cea7b - back in a86ae74da96c again
Kim Alvefur <zash@zash.se>
parents: 12048
diff changeset
   152
	if session.resending_unacked then return stanza end
12077
4cbe7979a92a mod_smacks: Fix traceback when bouncing unacked stanzas
Kim Alvefur <zash@zash.se>
parents: 12076
diff changeset
   153
	if not session.smacks then return stanza end
11983
705c4c07a860 mod_smacks: Use stanza type checking function for correctness
Kim Alvefur <zash@zash.se>
parents: 11982
diff changeset
   154
	local is_stanza = st.is_stanza(stanza) and
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   155
		(not stanza.attr.xmlns or stanza.attr.xmlns == 'jabber:client')
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   156
		and not stanza.name:find":";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   157
12049
a6c821720cb6 mod_smacks: Back out 48f8fa6cea7b - back in a86ae74da96c again
Kim Alvefur <zash@zash.se>
parents: 12048
diff changeset
   158
	if is_stanza then
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   159
		local queue = session.outgoing_stanza_queue;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   160
		local cached_stanza = st.clone(stanza);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   161
11987
27f2539b4f87 mod_smacks: Remove dead conditional
Kim Alvefur <zash@zash.se>
parents: 11986
diff changeset
   162
		if cached_stanza.name ~= "iq" and cached_stanza:get_child("delay", xmlns_delay) == nil then
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   163
			cached_stanza = cached_stanza:tag("delay", {
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   164
				xmlns = xmlns_delay,
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   165
				from = jid.bare(session.full_jid or session.host),
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   166
				stamp = datetime.datetime()
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   167
			});
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   168
		end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   169
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   170
		queue:push(cached_stanza);
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   171
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   172
		if session.hibernating then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   173
			session.log("debug", "hibernating since %s, stanza queued", datetime.datetime(session.hibernating));
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   174
			-- FIXME queue implementation changed, anything depending on it being an array will break
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   175
			module:fire_event("smacks-hibernation-stanza-queued", {origin = session, queue = queue:table(), stanza = cached_stanza});
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   176
			return nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   177
		end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   178
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   179
	return stanza;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   180
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   181
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   182
local function count_incoming_stanzas(stanza, session)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   183
	if not stanza.attr.xmlns then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   184
		session.handled_stanza_count = session.handled_stanza_count + 1;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   185
		session.log("debug", "Handled %d incoming stanzas", session.handled_stanza_count);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   186
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   187
	return stanza;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   188
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   189
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   190
local function wrap_session_out(session, resume)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   191
	if not resume then
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   192
		session.outgoing_stanza_queue = smqueue.new(queue_size);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   193
		session.last_acknowledged_stanza = 0;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   194
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   195
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   196
	add_filter(session, "stanzas/out", outgoing_stanza_filter, -999);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   197
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   198
	return session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   199
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   200
11979
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   201
module:hook("pre-session-close", function(event)
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   202
	local session = event.session;
12079
9f4d88f54a54 mod_smacks: Avoid log noise when a non-smacks session is closed
Kim Alvefur <zash@zash.se>
parents: 12078
diff changeset
   203
	if session.smacks == nil then return end
11979
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   204
	if session.resumption_token then
12073
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   205
		session.log("debug", "Revoking resumption token");
12057
03e9587fbfd2 mod_smacks: Switch storage for tracking resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
   206
		session_registry[jid.join(session.username, session.host, session.resumption_token)] = nil;
12055
c32ef09ab452 mod_smacks: Persist old counter values to storage
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
   207
		old_session_registry:set(session.username, session.resumption_token, nil);
11979
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   208
		session.resumption_token = nil;
12073
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   209
	else
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   210
		session.log("debug", "Session not resumable");
11979
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   211
	end
12066
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
   212
	if session.hibernating_watchdog then
12073
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   213
		session.log("debug", "Removing sleeping watchdog");
12066
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
   214
		-- If the session is being replaced instead of resume, we don't want the
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
   215
		-- old session around to time out and cause trouble for the new session
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
   216
		session.hibernating_watchdog:cancel();
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
   217
		session.hibernating_watchdog = nil;
12073
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   218
	else
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   219
		session.log("debug", "No watchdog set");
12066
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
   220
	end
11979
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   221
	-- send out last ack as per revision 1.5.2 of XEP-0198
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   222
	if session.smacks and session.conn and session.handled_stanza_count then
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   223
		(session.sends2s or session.send)(st.stanza("a", {
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   224
			xmlns = session.smacks;
11981
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
   225
			h = format_h(session.handled_stanza_count);
11979
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   226
		}));
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   227
	end
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   228
end);
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   229
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   230
local function wrap_session_in(session, resume)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   231
	if not resume then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   232
		session.handled_stanza_count = 0;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   233
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   234
	add_filter(session, "stanzas/in", count_incoming_stanzas, 999);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   235
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   236
	return session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   237
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   238
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   239
local function wrap_session(session, resume)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   240
	wrap_session_out(session, resume);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   241
	wrap_session_in(session, resume);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   242
	return session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   243
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   244
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   245
function handle_enable(session, stanza, xmlns_sm)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   246
	local ok, err, err_text = can_do_smacks(session);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   247
	if not ok then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   248
		session.log("warn", "Failed to enable smacks: %s", err_text); -- TODO: XEP doesn't say we can send error text, should it?
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   249
		(session.sends2s or session.send)(st.stanza("failed", { xmlns = xmlns_sm }):tag(err, { xmlns = xmlns_errors}));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   250
		return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   251
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   252
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   253
	module:log("debug", "Enabling stream management");
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   254
	session.smacks = xmlns_sm;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   255
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   256
	wrap_session(session, false);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   257
12084
9744a0ceb767 mod_smacks: Only include max resumption time when resumption is activated
Kim Alvefur <zash@zash.se>
parents: 12082
diff changeset
   258
	local resume_max;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   259
	local resume_token;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   260
	local resume = stanza.attr.resume;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   261
	if resume == "true" or resume == "1" then
12116
08a949e63541 mod_smacks: Use more compact resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12085
diff changeset
   262
		resume_token = new_id();
12057
03e9587fbfd2 mod_smacks: Switch storage for tracking resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
   263
		session_registry[jid.join(session.username, session.host, resume_token)] = session;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   264
		session.resumption_token = resume_token;
12084
9744a0ceb767 mod_smacks: Only include max resumption time when resumption is activated
Kim Alvefur <zash@zash.se>
parents: 12082
diff changeset
   265
		resume_max = tostring(resume_timeout);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   266
	end
12084
9744a0ceb767 mod_smacks: Only include max resumption time when resumption is activated
Kim Alvefur <zash@zash.se>
parents: 12082
diff changeset
   267
	(session.sends2s or session.send)(st.stanza("enabled", { xmlns = xmlns_sm, id = resume_token, resume = resume, max = resume_max }));
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   268
	return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   269
end
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   270
module:hook_tag(xmlns_sm2, "enable", function (session, stanza) return handle_enable(session, stanza, xmlns_sm2); end, 100);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   271
module:hook_tag(xmlns_sm3, "enable", function (session, stanza) return handle_enable(session, stanza, xmlns_sm3); end, 100);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   272
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   273
module:hook_tag("http://etherx.jabber.org/streams", "features",
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   274
		function (session, stanza)
11940
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   275
			-- Needs to be done after flushing sendq since those aren't stored as
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   276
			-- stanzas and counting them is weird.
12085
6cc3135138d7 mod_smacks: Add future todo
Kim Alvefur <zash@zash.se>
parents: 12084
diff changeset
   277
			-- TODO unify sendq and smqueue
11940
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   278
			timer.add_task(1e-6, function ()
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   279
				if can_do_smacks(session) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   280
					if stanza:get_child("sm", xmlns_sm3) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   281
						session.sends2s(st.stanza("enable", sm3_attr));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   282
						session.smacks = xmlns_sm3;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   283
					elseif stanza:get_child("sm", xmlns_sm2) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   284
						session.sends2s(st.stanza("enable", sm2_attr));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   285
						session.smacks = xmlns_sm2;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   286
					else
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   287
						return;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   288
					end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   289
					wrap_session_out(session, false);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   290
				end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   291
			end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   292
		end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   293
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   294
function handle_enabled(session, stanza, xmlns_sm) -- luacheck: ignore 212/stanza
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   295
	module:log("debug", "Enabling stream management");
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   296
	session.smacks = xmlns_sm;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   297
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   298
	wrap_session_in(session, false);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   299
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   300
	-- FIXME Resume?
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   301
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   302
	return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   303
end
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   304
module:hook_tag(xmlns_sm2, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm2); end, 100);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   305
module:hook_tag(xmlns_sm3, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm3); end, 100);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   306
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   307
function handle_r(origin, stanza, xmlns_sm) -- luacheck: ignore 212/stanza
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   308
	if not origin.smacks then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   309
		module:log("debug", "Received ack request from non-smack-enabled session");
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   310
		return;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   311
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   312
	module:log("debug", "Received ack request, acking for %d", origin.handled_stanza_count);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   313
	-- Reply with <a>
11981
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
   314
	(origin.sends2s or origin.send)(st.stanza("a", { xmlns = xmlns_sm, h = format_h(origin.handled_stanza_count) }));
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   315
	-- piggyback our own ack request if needed (see request_ack_if_needed() for explanation of last_requested_h)
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   316
	request_ack_now_if_needed(origin, false, "piggybacked by handle_r", nil);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   317
	return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   318
end
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   319
module:hook_tag(xmlns_sm2, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm2); end);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   320
module:hook_tag(xmlns_sm3, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm3); end);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   321
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   322
function handle_a(origin, stanza)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   323
	if not origin.smacks then return; end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   324
	origin.awaiting_ack = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   325
	if origin.awaiting_ack_timer then
11940
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   326
		timer.stop(origin.awaiting_ack_timer);
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   327
		origin.awaiting_ack_timer = nil;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   328
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   329
	if origin.delayed_ack_timer then
11940
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   330
		timer.stop(origin.delayed_ack_timer)
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   331
		origin.delayed_ack_timer = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   332
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   333
	-- Remove handled stanzas from outgoing_stanza_queue
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   334
	local h = tonumber(stanza.attr.h);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   335
	if not h then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   336
		origin:close{ condition = "invalid-xml"; text = "Missing or invalid 'h' attribute"; };
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   337
		return;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   338
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   339
	local queue = origin.outgoing_stanza_queue;
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   340
	local handled_stanza_count = h-queue:count_acked();
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   341
	local acked, err = ack_errors.coerce(queue:ack(h)); -- luacheck: ignore 211/acked
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   342
	if err then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   343
		origin.log("warn", "The client says it handled %d new stanzas, but we sent %d :)",
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   344
			handled_stanza_count, queue:count_unacked());
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   345
		origin.log("debug", "Client h: %d, our h: %d", tonumber(stanza.attr.h), queue:count_acked());
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   346
		for i, item in queue._queue:items() do
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   347
			origin.log("debug", "Q item %d: %s", i, item);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   348
		end
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   349
		origin:close(err);
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   350
		return;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   351
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   352
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   353
	origin.log("debug", "#queue = %d", queue:count_unacked());
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   354
	request_ack_now_if_needed(origin, false, "handle_a", nil)
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   355
	return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   356
end
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   357
module:hook_tag(xmlns_sm2, "a", handle_a);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   358
module:hook_tag(xmlns_sm3, "a", handle_a);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   359
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   360
local function handle_unacked_stanzas(session)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   361
	local queue = session.outgoing_stanza_queue;
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   362
	if queue:count_unacked() > 0 then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   363
		session.smacks = false; -- Disable queueing
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   364
		session.outgoing_stanza_queue = nil;
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   365
		for stanza in queue._queue:consume() do
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   366
			if not module:fire_event("delivery/failure", { session = session, stanza = stanza }) then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   367
				if stanza.attr.type ~= "error" and stanza.attr.to ~= session.full_jid then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   368
					local reply = st.error_reply(stanza, "cancel", "recipient-unavailable");
12001
1ea01660c79a mod_smacks: Refactor, simplify, optimize
Kim Alvefur <zash@zash.se>
parents: 12000
diff changeset
   369
					core_process_stanza(session, reply);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   370
				end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   371
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   372
		end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   373
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   374
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   375
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   376
-- don't send delivery errors for messages which will be delivered by mam later on
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   377
-- check if stanza was archived --> this will allow us to send back errors for stanzas not archived
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   378
-- because the user configured the server to do so ("no-archive"-setting for one special contact for example)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   379
module:hook("delivery/failure", function(event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   380
	local session, stanza = event.session, event.stanza;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   381
	-- Only deal with authenticated (c2s) sessions
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   382
	if session.username then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   383
		if stanza.name == "message" and stanza.attr.xmlns == nil and
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   384
				( stanza.attr.type == "chat" or ( stanza.attr.type or "normal" ) == "normal" ) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   385
			-- don't store messages in offline store if they are mam results
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   386
			local mam_result = stanza:get_child("result", xmlns_mam2);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   387
			if mam_result ~= nil then
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   388
				return true; -- stanza already "handled", don't send an error and don't add it to offline storage
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   389
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   390
			-- do nothing here for normal messages and don't send out "message delivery errors",
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   391
			-- because messages are already in MAM at this point (no need to frighten users)
12118
e32f90c81519 mod_smacks: Compact code using new stanza API
Kim Alvefur <zash@zash.se>
parents: 12116
diff changeset
   392
			local stanza_id = stanza:get_child_with_attr("stanza-id", "urn:xmpp:sid:0", "by", jid.bare(session.full_jid));
e32f90c81519 mod_smacks: Compact code using new stanza API
Kim Alvefur <zash@zash.se>
parents: 12116
diff changeset
   393
			stanza_id = stanza_id and stanza_id.attr.id;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   394
			if session.mam_requested and stanza_id ~= nil then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   395
				session.log("debug", "mod_smacks delivery/failure returning true for mam-handled stanza: mam-archive-id=%s", tostring(stanza_id));
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   396
				return true; -- stanza handled, don't send an error
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   397
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   398
			-- store message in offline store, if this client does not use mam *and* was the last client online
12067
d308f6901397 mod_smacks: Simplify access to local user sessions
Kim Alvefur <zash@zash.se>
parents: 12066
diff changeset
   399
			local sessions = local_sessions[session.username] and local_sessions[session.username].sessions or nil;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   400
			if sessions and next(sessions) == session.resource and next(sessions, session.resource) == nil then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   401
				local ok = module:fire_event("message/offline/handle", { origin = session, username = session.username, stanza = stanza });
12052
f087bfd021ad mod_smacks: Fix typo
Kim Alvefur <zash@zash.se>
parents: 12051
diff changeset
   402
				session.log("debug", "mod_smacks delivery/failure returning %s for offline-handled stanza", tostring(ok));
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   403
				return ok; -- if stanza was handled, don't send an error
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   404
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   405
		end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   406
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   407
end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   408
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   409
module:hook("pre-resource-unbind", function (event)
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   410
	local session = event.session;
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   411
	if not session.smacks then return end
12064
3099e03b10bd mod_smacks: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
   412
	if not session.resumption_token then
3099e03b10bd mod_smacks: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
   413
		local queue = session.outgoing_stanza_queue;
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   414
		if queue:count_unacked() > 0 then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   415
			session.log("debug", "Destroying session with %d unacked stanzas", queue:count_unacked());
12064
3099e03b10bd mod_smacks: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
   416
			handle_unacked_stanzas(session);
3099e03b10bd mod_smacks: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
   417
		end
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   418
		return
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   419
	end
12076
ef0f174488af mod_smacks: Fix duplicate sleep behavior when replacing a session
Kim Alvefur <zash@zash.se>
parents: 12074
diff changeset
   420
	if session.hibernating then return end
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   421
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   422
	session.hibernating = os_time();
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   423
	session.hibernating_watchdog = watchdog.new(resume_timeout, function()
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   424
		session.log("debug", "mod_smacks hibernation timeout reached...");
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   425
		if session.destroyed then
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   426
			session.log("debug", "The session has already been destroyed");
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   427
			return
12065
31a7e0ac6928 mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
   428
		elseif not session.resumption_token then
31a7e0ac6928 mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
   429
			-- This should normally not happen, the watchdog should be canceled from session:close()
31a7e0ac6928 mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
   430
			session.log("debug", "The session has already been resumed or replaced");
31a7e0ac6928 mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
   431
			return
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   432
		end
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   433
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   434
		session.log("debug", "Destroying session for hibernating too long");
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   435
		session_registry[jid.join(session.username, session.host, session.resumption_token)] = nil;
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   436
		old_session_registry:set(session.username, session.resumption_token, { h = session.handled_stanza_count });
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   437
		session.resumption_token = nil;
12063
70a55fbe447c mod_smacks: Stop stanzas from being queued on hibernation timeout
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
   438
		session.resending_unacked = true; -- stop outgoing_stanza_filter from re-queueing anything anymore
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   439
		sessionmanager.destroy_session(session, "Hibernating too long");
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   440
	end);
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   441
	if session.conn then
12074
e662c172ea0f mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents: 12073
diff changeset
   442
		local conn = session.conn;
e662c172ea0f mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents: 12073
diff changeset
   443
		c2s_sessions[conn] = nil;
e662c172ea0f mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents: 12073
diff changeset
   444
		session.conn = nil;
e662c172ea0f mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents: 12073
diff changeset
   445
		conn:close();
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   446
	end
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   447
	module:fire_event("smacks-hibernation-start", { origin = session; queue = session.outgoing_stanza_queue:table() });
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   448
	return true; -- Postpone destruction for now
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   449
end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   450
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   451
local function handle_s2s_destroyed(event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   452
	local session = event.session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   453
	local queue = session.outgoing_stanza_queue;
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   454
	if queue and queue:count_unacked() > 0 then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   455
		session.log("warn", "Destroying session with %d unacked stanzas", queue:count_unacked());
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   456
		if s2s_resend then
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   457
			for stanza in queue:consume() do
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   458
				module:send(stanza);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   459
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   460
			session.outgoing_stanza_queue = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   461
		else
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   462
			handle_unacked_stanzas(session);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   463
		end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   464
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   465
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   466
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   467
module:hook("s2sout-destroyed", handle_s2s_destroyed);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   468
module:hook("s2sin-destroyed", handle_s2s_destroyed);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   469
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   470
local function get_session_id(session)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   471
	return session.id or (tostring(session):match("[a-f0-9]+$"));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   472
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   473
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   474
function handle_resume(session, stanza, xmlns_sm)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   475
	if session.full_jid then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   476
		session.log("warn", "Tried to resume after resource binding");
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   477
		session.send(st.stanza("failed", { xmlns = xmlns_sm })
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   478
			:tag("unexpected-request", { xmlns = xmlns_errors })
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   479
		);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   480
		return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   481
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   482
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   483
	local id = stanza.attr.previd;
12057
03e9587fbfd2 mod_smacks: Switch storage for tracking resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
   484
	local original_session = session_registry[jid.join(session.username, session.host, id)];
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   485
	if not original_session then
12055
c32ef09ab452 mod_smacks: Persist old counter values to storage
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
   486
		local old_session = old_session_registry:get(session.username, id);
11982
628374809421 mod_smacks: Remove redundant fields
Kim Alvefur <zash@zash.se>
parents: 11981
diff changeset
   487
		if old_session then
12070
f07c8240a71d mod_smacks: Split log messages for when an old session exists in storage
Kim Alvefur <zash@zash.se>
parents: 12069
diff changeset
   488
			session.log("debug", "Tried to resume old expired session with id %s", id);
11981
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
   489
			session.send(st.stanza("failed", { xmlns = xmlns_sm, h = format_h(old_session.h) })
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   490
				:tag("item-not-found", { xmlns = xmlns_errors })
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   491
			);
12056
d17b8fcf11c7 mod_smacks: Clear resumption token from persistent storage on resumption
Kim Alvefur <zash@zash.se>
parents: 12055
diff changeset
   492
			old_session_registry:set(session.username, id, nil);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   493
		else
12070
f07c8240a71d mod_smacks: Split log messages for when an old session exists in storage
Kim Alvefur <zash@zash.se>
parents: 12069
diff changeset
   494
			session.log("debug", "Tried to resume non-existent session with id %s", id);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   495
			session.send(st.stanza("failed", { xmlns = xmlns_sm })
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   496
				:tag("item-not-found", { xmlns = xmlns_errors })
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   497
			);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   498
		end;
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   499
	else
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   500
		if original_session.hibernating_watchdog then
12073
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   501
			original_session.log("debug", "Letting the watchdog go");
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   502
			original_session.hibernating_watchdog:cancel();
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   503
			original_session.hibernating_watchdog = nil;
12078
b892f5489d79 mod_smacks: Check if session was really sleeping before logging message
Kim Alvefur <zash@zash.se>
parents: 12077
diff changeset
   504
		elseif session.hibernating then
12073
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   505
			original_session.log("error", "Hibernating session has no watchdog!")
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   506
		end
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   507
		session.log("debug", "mod_smacks resuming existing session %s...", get_session_id(original_session));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   508
		original_session.log("debug", "mod_smacks session resumed from %s...", get_session_id(session));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   509
		-- TODO: All this should move to sessionmanager (e.g. session:replace(new_session))
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   510
		if original_session.conn then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   511
			original_session.log("debug", "mod_smacks closing an old connection for this session");
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   512
			local conn = original_session.conn;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   513
			c2s_sessions[conn] = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   514
			conn:close();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   515
		end
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   516
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   517
		local migrated_session_log = session.log;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   518
		original_session.ip = session.ip;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   519
		original_session.conn = session.conn;
12048
9eb1a178293e mod_smacks: Patch various self-references on the resumed session
Kim Alvefur <zash@zash.se>
parents: 12047
diff changeset
   520
		original_session.rawsend = session.rawsend;
9eb1a178293e mod_smacks: Patch various self-references on the resumed session
Kim Alvefur <zash@zash.se>
parents: 12047
diff changeset
   521
		original_session.rawsend.session = original_session;
9eb1a178293e mod_smacks: Patch various self-references on the resumed session
Kim Alvefur <zash@zash.se>
parents: 12047
diff changeset
   522
		original_session.rawsend.conn = original_session.conn;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   523
		original_session.send = session.send;
12048
9eb1a178293e mod_smacks: Patch various self-references on the resumed session
Kim Alvefur <zash@zash.se>
parents: 12047
diff changeset
   524
		original_session.send.session = original_session;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   525
		original_session.close = session.close;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   526
		original_session.filter = session.filter;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   527
		original_session.filter.session = original_session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   528
		original_session.filters = session.filters;
12048
9eb1a178293e mod_smacks: Patch various self-references on the resumed session
Kim Alvefur <zash@zash.se>
parents: 12047
diff changeset
   529
		original_session.send.filter = original_session.filter;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   530
		original_session.stream = session.stream;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   531
		original_session.secure = session.secure;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   532
		original_session.hibernating = nil;
12050
372ec5cd0f51 mod_smacks: Increment a counter for each resumption
Kim Alvefur <zash@zash.se>
parents: 12049
diff changeset
   533
		original_session.resumption_counter = (original_session.resumption_counter or 0) + 1;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   534
		session.log = original_session.log;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   535
		session.type = original_session.type;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   536
		wrap_session(original_session, true);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   537
		-- Inform xmppstream of the new session (passed to its callbacks)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   538
		original_session.stream:set_session(original_session);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   539
		-- Similar for connlisteners
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   540
		c2s_sessions[session.conn] = original_session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   541
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   542
		local queue = original_session.outgoing_stanza_queue;
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   543
		local h = tonumber(stanza.attr.h);
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   544
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   545
		original_session.log("debug", "Pre-resumption #queue = %d", queue:count_unacked())
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   546
		local acked, err = ack_errors.coerce(queue:ack(h)); -- luacheck: ignore 211/acked
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   547
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   548
		if not err and not queue:resumable() then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   549
			err = ack_errors.new("overflow");
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   550
		end
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   551
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   552
		if err or not queue:resumable() then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   553
			original_session.send(st.stanza("failed",
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   554
				{ xmlns = xmlns_sm; h = format_h(original_session.handled_stanza_count); previd = id }));
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   555
			original_session:close(err);
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   556
			return false;
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   557
		end
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   558
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   559
		original_session.send(st.stanza("resumed", { xmlns = xmlns_sm,
11981
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
   560
			h = format_h(original_session.handled_stanza_count), previd = id }));
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   561
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   562
		-- Ok, we need to re-send any stanzas that the client didn't see
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   563
		-- ...they are what is now left in the outgoing stanza queue
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   564
		-- We have to use the send of "session" because we don't want to add our resent stanzas
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   565
		-- to the outgoing queue again
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   566
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   567
		session.log("debug", "resending all unacked stanzas that are still queued after resume, #queue = %d", queue:count_unacked());
12051
81858fd6f198 mod_smacks: Flag both sessions to prevent duplicating queue on resumption
Kim Alvefur <zash@zash.se>
parents: 12050
diff changeset
   568
		-- FIXME Which session is it that the queue filter sees?
12049
a6c821720cb6 mod_smacks: Back out 48f8fa6cea7b - back in a86ae74da96c again
Kim Alvefur <zash@zash.se>
parents: 12048
diff changeset
   569
		session.resending_unacked = true;
12051
81858fd6f198 mod_smacks: Flag both sessions to prevent duplicating queue on resumption
Kim Alvefur <zash@zash.se>
parents: 12050
diff changeset
   570
		original_session.resending_unacked = true;
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   571
		for _, queued_stanza in queue:resume() do
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   572
			session.send(queued_stanza);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   573
		end
12049
a6c821720cb6 mod_smacks: Back out 48f8fa6cea7b - back in a86ae74da96c again
Kim Alvefur <zash@zash.se>
parents: 12048
diff changeset
   574
		session.resending_unacked = nil;
12051
81858fd6f198 mod_smacks: Flag both sessions to prevent duplicating queue on resumption
Kim Alvefur <zash@zash.se>
parents: 12050
diff changeset
   575
		original_session.resending_unacked = nil;
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   576
		session.log("debug", "all stanzas resent, now disabling send() in this migrated session, #queue = %d", queue:count_unacked());
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   577
		function session.send(stanza) -- luacheck: ignore 432
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   578
			migrated_session_log("error", "Tried to send stanza on old session migrated by smacks resume (maybe there is a bug?): %s", tostring(stanza));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   579
			return false;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   580
		end
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   581
		module:fire_event("smacks-hibernation-end", {origin = session, resumed = original_session, queue = queue:table()});
12071
97c377de8083 mod_smacks: Fix to not wait for acks from before a resumption
Kim Alvefur <zash@zash.se>
parents: 12070
diff changeset
   582
		original_session.awaiting_ack = nil; -- Don't wait for acks from before the resumption
12072
c3790ffdf467 mod_smacks: Remove useless delay in requesting ack on resumption
Kim Alvefur <zash@zash.se>
parents: 12071
diff changeset
   583
		request_ack_now_if_needed(original_session, true, "handle_resume", nil);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   584
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   585
	return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   586
end
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   587
module:hook_tag(xmlns_sm2, "resume", function (session, stanza) return handle_resume(session, stanza, xmlns_sm2); end);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   588
module:hook_tag(xmlns_sm3, "resume", function (session, stanza) return handle_resume(session, stanza, xmlns_sm3); end);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   589
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   590
-- Events when it's sensible to request an ack
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   591
-- Could experiment with forcing (ignoring max_unacked) <r>, but when and why?
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   592
local request_ack_events = {
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   593
	["csi-client-active"] = true;
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   594
	["csi-flushing"] = false;
11942
6da703cb4c04 mod_smacks: Optimize scheduling of ack requests
Kim Alvefur <zash@zash.se>
parents: 11941
diff changeset
   595
	["c2s-pre-ondrain"] = false;
6da703cb4c04 mod_smacks: Optimize scheduling of ack requests
Kim Alvefur <zash@zash.se>
parents: 11941
diff changeset
   596
	["s2s-pre-ondrain"] = false;
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   597
};
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   598
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   599
for event_name, force in pairs(request_ack_events) do
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   600
	module:hook(event_name, function(event)
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   601
		local session = event.session or event.origin;
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   602
		request_ack_now_if_needed(session, force, event_name);
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   603
	end);
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   604
end
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   605
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   606
local function handle_read_timeout(event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   607
	local session = event.session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   608
	if session.smacks then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   609
		if session.awaiting_ack then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   610
			if session.awaiting_ack_timer then
11940
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   611
				timer.stop(session.awaiting_ack_timer);
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   612
				session.awaiting_ack_timer = nil;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   613
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   614
			if session.delayed_ack_timer then
11940
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   615
				timer.stop(session.delayed_ack_timer);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   616
				session.delayed_ack_timer = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   617
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   618
			return false; -- Kick the session
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   619
		end
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   620
		request_ack_now_if_needed(session, true, "read timeout");
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   621
		return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   622
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   623
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   624
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   625
module:hook("s2s-read-timeout", handle_read_timeout);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   626
module:hook("c2s-read-timeout", handle_read_timeout);
12068
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   627
12069
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   628
module:hook_global("server-stopping", function(event)
12081
061d516d8ac5 mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents: 12080
diff changeset
   629
	if not local_sessions then
061d516d8ac5 mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents: 12080
diff changeset
   630
		-- not a VirtualHost, no user sessions
061d516d8ac5 mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents: 12080
diff changeset
   631
		return
061d516d8ac5 mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents: 12080
diff changeset
   632
	end
12069
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   633
	local reason = event.reason;
12082
2c13aaae35ac mod_smacks: Fix typos
Kim Alvefur <zash@zash.se>
parents: 12081
diff changeset
   634
	-- Close smacks-enabled sessions ourselves instead of letting mod_c2s close
12068
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   635
	-- it, which invalidates the smacks session. This allows preserving the
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   636
	-- counter value, so it can be communicated to the client when it tries to
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   637
	-- resume the lost session after a restart.
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   638
	for _, user in pairs(local_sessions) do
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   639
		for _, session in pairs(user.sessions) do
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   640
			if session.resumption_token then
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   641
				if old_session_registry:set(session.username, session.resumption_token, { h = session.handled_stanza_count }) then
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   642
					session.resumption_token = nil;
12069
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   643
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   644
					-- Deal with unacked stanzas
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   645
					if session.outgoing_stanza_queue then
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   646
						handle_unacked_stanzas(session);
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   647
					end
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   648
12068
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   649
					if session.conn then
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   650
						session.conn:close()
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   651
						session.conn = nil;
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   652
						-- Now when mod_c2s gets here, it will immediately destroy the
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   653
						-- session since it is unconnected.
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   654
					end
12069
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   655
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   656
					-- And make sure nobody tries to send anything
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   657
					session:close{ condition = "system-shutdown", text = reason };
12068
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   658
				end
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   659
			end
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   660
		end
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   661
	end
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   662
end, -90);