plugins/mod_csi_simple.lua
author Kim Alvefur <zash@zash.se>
Sun, 10 May 2020 23:12:33 +0200
changeset 10837 ac691f305ea7
parent 10836 7395f6e68dba
child 11264 08b397c21805
permissions -rw-r--r--
mod_csi_simple: Report whatever's not a stirng and not a stanza This is either dead code or actually a type error, but catching that should be the responsibility of the session.send function. This type check is left since everything after it assumes a stanza object. These last few commits aren't meant to change any behavior and it did mark things not stanzas as important, but those would have been mostly raw strings which are now specially handled.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10728
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
     1
-- Copyright (C) 2016-2020 Kim Alvefur
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
--
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
-- This project is MIT/X11 licensed. Please see the
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
-- COPYING file in the source package for more information.
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
--
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
module:depends"csi"
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
local jid = require "util.jid";
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
local st = require "util.stanza";
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
local dt = require "util.datetime";
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
    12
local filters = require "util.filters";
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
local queue_size = module:get_option_number("csi_queue_size", 256);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
10728
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    16
local important_payloads = module:get_option_set("csi_important_payloads", { });
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    17
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    18
function is_important(stanza) --> boolean, reason: string
10836
7395f6e68dba mod_csi_simple: Report whitespace keepalives
Kim Alvefur <zash@zash.se>
parents: 10835
diff changeset
    19
	if stanza == " " then
7395f6e68dba mod_csi_simple: Report whitespace keepalives
Kim Alvefur <zash@zash.se>
parents: 10835
diff changeset
    20
		return true, "whitespace keepalive";
7395f6e68dba mod_csi_simple: Report whitespace keepalives
Kim Alvefur <zash@zash.se>
parents: 10835
diff changeset
    21
	elseif type(stanza) == "string" then
10835
7dd7cdb43181 mod_csi_simple: Identify raw string data in logging and stats
Kim Alvefur <zash@zash.se>
parents: 10834
diff changeset
    22
		return true, "raw data";
7dd7cdb43181 mod_csi_simple: Identify raw string data in logging and stats
Kim Alvefur <zash@zash.se>
parents: 10834
diff changeset
    23
	elseif not st.is_stanza(stanza) then
10837
ac691f305ea7 mod_csi_simple: Report whatever's not a stirng and not a stanza
Kim Alvefur <zash@zash.se>
parents: 10836
diff changeset
    24
		-- This should probably never happen
ac691f305ea7 mod_csi_simple: Report whatever's not a stirng and not a stanza
Kim Alvefur <zash@zash.se>
parents: 10836
diff changeset
    25
		return true, type(stanza);
9636
fdefc43bffff mod_csi_simple: Consider non-stanza objects important
Kim Alvefur <zash@zash.se>
parents: 9635
diff changeset
    26
	end
10774
b4cbe72966c9 mod_csi_simple: Consider nonzas important
Kim Alvefur <zash@zash.se>
parents: 10773
diff changeset
    27
	if stanza.attr.xmlns ~= nil then
b4cbe72966c9 mod_csi_simple: Consider nonzas important
Kim Alvefur <zash@zash.se>
parents: 10773
diff changeset
    28
		-- stream errors, stream management etc
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    29
		return true, "nonza";
10774
b4cbe72966c9 mod_csi_simple: Consider nonzas important
Kim Alvefur <zash@zash.se>
parents: 10773
diff changeset
    30
	end
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
	local st_name = stanza.name;
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
	if not st_name then return false; end
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
	local st_type = stanza.attr.type;
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
	if st_name == "presence" then
10828
c8430ee33967 mod_csi_simple: Fix treating presence errors as presence updates
Kim Alvefur <zash@zash.se>
parents: 10827
diff changeset
    35
		if st_type == nil or st_type == "unavailable" or st_type == "error" then
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    36
			return false, "presence update";
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
		end
10805
2b97aac0ea3c mod_csi_simple: Don't consider presence errors as important
Kim Alvefur <zash@zash.se>
parents: 10776
diff changeset
    38
		-- TODO Some MUC awareness, e.g. check for the 'this relates to you' status code
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    39
		return true, "subscription request";
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
	elseif st_name == "message" then
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
		if st_type == "headline" then
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    42
			-- Headline messages are ephemeral by definition
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    43
			return false, "headline";
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
		end
10805
2b97aac0ea3c mod_csi_simple: Don't consider presence errors as important
Kim Alvefur <zash@zash.se>
parents: 10776
diff changeset
    45
		if st_type == "error" then
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    46
			return true, "delivery failure";
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
		end
9772
ab12fd48e124 mod_csi_simple: Consider messages forwarded from another of the users clients as important (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9771
diff changeset
    48
		if stanza:get_child("sent", "urn:xmpp:carbons:2") then
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    49
			return true, "carbon";
9772
ab12fd48e124 mod_csi_simple: Consider messages forwarded from another of the users clients as important (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9771
diff changeset
    50
		end
9773
150e9574c149 mod_csi_simple: Unpack Carbons-forwarded messages (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9772
diff changeset
    51
		local forwarded = stanza:find("{urn:xmpp:carbons:2}received/{urn:xmpp:forward:0}/{jabber:client}message");
150e9574c149 mod_csi_simple: Unpack Carbons-forwarded messages (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9772
diff changeset
    52
		if forwarded then
150e9574c149 mod_csi_simple: Unpack Carbons-forwarded messages (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9772
diff changeset
    53
			stanza = forwarded;
150e9574c149 mod_csi_simple: Unpack Carbons-forwarded messages (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9772
diff changeset
    54
		end
9771
57ceffb13963 mod_csi_simple: Tweak check for <body>
Kim Alvefur <zash@zash.se>
parents: 9655
diff changeset
    55
		if stanza:get_child("body") then
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    56
			return true, "body";
9771
57ceffb13963 mod_csi_simple: Tweak check for <body>
Kim Alvefur <zash@zash.se>
parents: 9655
diff changeset
    57
		end
9774
76cb409db537 mod_csi_simple: Consider messages with subject (eg MUC joins) (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9773
diff changeset
    58
		if stanza:get_child("subject") then
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    59
			-- Last step of a MUC join
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    60
			return true, "subject";
9774
76cb409db537 mod_csi_simple: Consider messages with subject (eg MUC joins) (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9773
diff changeset
    61
		end
9775
bf92f37de137 mod_csi_simple: Consider messages encrypted payload as important (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9774
diff changeset
    62
		if stanza:get_child("encryption", "urn:xmpp:eme:0") then
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    63
			-- Since we can't know what an encrypted message contains, we assume it's important
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    64
			-- XXX Experimental XEP
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    65
			return true, "encrypted";
9775
bf92f37de137 mod_csi_simple: Consider messages encrypted payload as important (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9774
diff changeset
    66
		end
10737
89e0f5cb60a1 mod_csi_simple: Consider MUC invites important
Kim Alvefur <zash@zash.se>
parents: 10728
diff changeset
    67
		if stanza:get_child("x", "jabber:x:conference") or stanza:find("{http://jabber.org/protocol/muc#user}x/invite") then
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    68
			return true, "invite";
10737
89e0f5cb60a1 mod_csi_simple: Consider MUC invites important
Kim Alvefur <zash@zash.se>
parents: 10728
diff changeset
    69
		end
10826
af42448a8e98 mod_csi_simple: Fix unintentional order of rules from merge
Kim Alvefur <zash@zash.se>
parents: 10821
diff changeset
    70
		if stanza:get_child(nil, "urn:xmpp:jingle-message:0") then
10827
b8be600803ee mod_csi_simple: Add comment highlighting that XEP-0353 is experimental
Kim Alvefur <zash@zash.se>
parents: 10826
diff changeset
    71
			-- XXX Experimental XEP stuck in Proposed for almost a year at the time of this comment
10826
af42448a8e98 mod_csi_simple: Fix unintentional order of rules from merge
Kim Alvefur <zash@zash.se>
parents: 10821
diff changeset
    72
			return true, "jingle call";
af42448a8e98 mod_csi_simple: Fix unintentional order of rules from merge
Kim Alvefur <zash@zash.se>
parents: 10821
diff changeset
    73
		end
10728
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    74
		for important in important_payloads do
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    75
			if stanza:find(important) then
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    76
				return true;
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    77
			end
9775
bf92f37de137 mod_csi_simple: Consider messages encrypted payload as important (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9774
diff changeset
    78
		end
9771
57ceffb13963 mod_csi_simple: Tweak check for <body>
Kim Alvefur <zash@zash.se>
parents: 9655
diff changeset
    79
		return false;
10776
31e702c5f475 mod_csi_simple: Explicitly mention iq stanzas
Kim Alvefur <zash@zash.se>
parents: 10775
diff changeset
    80
	elseif st_name == "iq" then
31e702c5f475 mod_csi_simple: Explicitly mention iq stanzas
Kim Alvefur <zash@zash.se>
parents: 10775
diff changeset
    81
		return true;
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
	end
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    83
end
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    84
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    85
module:hook("csi-is-stanza-important", function (event)
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    86
	local important, why = is_important(event.stanza);
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    87
	event.reason = why;
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    88
	return important;
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    89
end, -1);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    90
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    91
local function should_flush(stanza, session, ctr) --> boolean, reason: string
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    92
	if ctr >= queue_size then
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    93
		return true, "queue size limit reached";
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    94
	end
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    95
	local event = { stanza = stanza, session = session };
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    96
	local ret = module:fire_event("csi-is-stanza-important", event)
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    97
	return ret, event.reason;
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    98
end
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    99
9915
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
   100
local function with_timestamp(stanza, from)
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
   101
	if st.is_stanza(stanza) and stanza.attr.xmlns == nil and stanza.name ~= "iq" then
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
   102
		stanza = st.clone(stanza);
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
   103
		stanza:add_direct_child(st.stanza("delay", {xmlns = "urn:xmpp:delay", from = from, stamp = dt.datetime()}));
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
   104
	end
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
   105
	return stanza;
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
   106
end
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
   107
10833
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   108
local measure_buffer_hold = module:measure("buffer_hold", "times");
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   109
10834
8889d5037aca mod_csi_simple: Collect stats on flush reasons
Kim Alvefur <zash@zash.se>
parents: 10833
diff changeset
   110
local flush_reasons = setmetatable({}, {
8889d5037aca mod_csi_simple: Collect stats on flush reasons
Kim Alvefur <zash@zash.se>
parents: 10833
diff changeset
   111
		__index = function (t, reason)
8889d5037aca mod_csi_simple: Collect stats on flush reasons
Kim Alvefur <zash@zash.se>
parents: 10833
diff changeset
   112
			local m = module:measure("flush_reason."..reason:gsub("%W", "_"), "rate");
8889d5037aca mod_csi_simple: Collect stats on flush reasons
Kim Alvefur <zash@zash.se>
parents: 10833
diff changeset
   113
			t[reason] = m;
8889d5037aca mod_csi_simple: Collect stats on flush reasons
Kim Alvefur <zash@zash.se>
parents: 10833
diff changeset
   114
			return m;
8889d5037aca mod_csi_simple: Collect stats on flush reasons
Kim Alvefur <zash@zash.se>
parents: 10833
diff changeset
   115
		end;
8889d5037aca mod_csi_simple: Collect stats on flush reasons
Kim Alvefur <zash@zash.se>
parents: 10833
diff changeset
   116
	});
8889d5037aca mod_csi_simple: Collect stats on flush reasons
Kim Alvefur <zash@zash.se>
parents: 10833
diff changeset
   117
8889d5037aca mod_csi_simple: Collect stats on flush reasons
Kim Alvefur <zash@zash.se>
parents: 10833
diff changeset
   118
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   119
local function manage_buffer(stanza, session)
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   120
	local ctr = session.csi_counter or 0;
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
   121
	local flush, why = should_flush(stanza, session, ctr);
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
   122
	if flush then
10833
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   123
		if session.csi_measure_buffer_hold then
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   124
			session.csi_measure_buffer_hold();
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   125
			session.csi_measure_buffer_hold = nil;
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   126
		end
10834
8889d5037aca mod_csi_simple: Collect stats on flush reasons
Kim Alvefur <zash@zash.se>
parents: 10833
diff changeset
   127
		flush_reasons[why or "important"]();
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
   128
		session.log("debug", "Flushing buffer (%s; queue size is %d)", why or "important", session.csi_counter);
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   129
		session.conn:resume_writes();
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   130
	else
10812
0d365c0ee9fe mod_csi_simple: Log reasons for not flushing
Kim Alvefur <zash@zash.se>
parents: 10811
diff changeset
   131
		session.log("debug", "Holding buffer (%s; queue size is %d)", why or "unimportant", session.csi_counter);
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   132
		stanza = with_timestamp(stanza, jid.join(session.username, session.host))
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   133
	end
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   134
	session.csi_counter = ctr + 1;
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   135
	return stanza;
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   136
end
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   137
9917
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   138
local function flush_buffer(data, session)
10832
c12ed21f877e mod_csi_simple: Change debug message of client-triggered flush for coherence
Kim Alvefur <zash@zash.se>
parents: 10831
diff changeset
   139
	session.log("debug", "Flushing buffer (%s; queue size is %d)", "client activity", session.csi_counter);
10834
8889d5037aca mod_csi_simple: Collect stats on flush reasons
Kim Alvefur <zash@zash.se>
parents: 10833
diff changeset
   140
	flush_reasons["client activity"]();
10833
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   141
	if session.csi_measure_buffer_hold then
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   142
		session.csi_measure_buffer_hold();
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   143
		session.csi_measure_buffer_hold = nil;
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   144
	end
9917
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   145
	session.conn:resume_writes();
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   146
	return data;
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   147
end
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   148
9922
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   149
function enable_optimizations(session)
10281
45a58127a3e5 mod_csi_simple: Remove duplicated check for connection
Kim Alvefur <zash@zash.se>
parents: 10029
diff changeset
   150
	if session.conn and session.conn.pause_writes then
9913
3229be01a08a mod_csi_simple: Use write locks in net.server if available
Kim Alvefur <zash@zash.se>
parents: 9775
diff changeset
   151
		session.conn:pause_writes();
10833
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   152
		session.csi_measure_buffer_hold = measure_buffer_hold();
10831
d8e83d94a99a mod_csi_simple: Reset queue counter to zero when enabling
Kim Alvefur <zash@zash.se>
parents: 10830
diff changeset
   153
		session.csi_counter = 0;
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   154
		filters.add_filter(session, "stanzas/out", manage_buffer);
9917
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   155
		filters.add_filter(session, "bytes/in", flush_buffer);
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   156
	else
9921
45b5528b128a mod_csi_simple: Remove old "pump" queue/buffer method, handled in net.server now
Kim Alvefur <zash@zash.se>
parents: 9918
diff changeset
   157
		session.log("warn", "Session connection does not support write pausing");
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   158
	end
9922
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   159
end
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   160
9926
06bf5ccd859f mod_csi_simple: Fix type in function name
Matthew Wild <mwild1@gmail.com>
parents: 9925
diff changeset
   161
function disable_optimizations(session)
10307
c434bff22b14 mod_csi_simple: Always remove session filters when disabling CSI
Kim Alvefur <zash@zash.se>
parents: 10306
diff changeset
   162
	filters.remove_filter(session, "stanzas/out", manage_buffer);
c434bff22b14 mod_csi_simple: Always remove session filters when disabling CSI
Kim Alvefur <zash@zash.se>
parents: 10306
diff changeset
   163
	filters.remove_filter(session, "bytes/in", flush_buffer);
10830
4f7226d5ee30 mod_csi_simple: Forget queue counter when disabling optimizations
Kim Alvefur <zash@zash.se>
parents: 10829
diff changeset
   164
	session.csi_counter = nil;
10833
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   165
	if session.csi_measure_buffer_hold then
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   166
		session.csi_measure_buffer_hold();
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   167
		session.csi_measure_buffer_hold = nil;
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   168
	end
10281
45a58127a3e5 mod_csi_simple: Remove duplicated check for connection
Kim Alvefur <zash@zash.se>
parents: 10029
diff changeset
   169
	if session.conn and session.conn.resume_writes then
9913
3229be01a08a mod_csi_simple: Use write locks in net.server if available
Kim Alvefur <zash@zash.se>
parents: 9775
diff changeset
   170
		session.conn:resume_writes();
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   171
	end
9922
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   172
end
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   173
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   174
module:hook("csi-client-inactive", function (event)
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   175
	local session = event.origin;
9922
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   176
	enable_optimizations(session);
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   177
end);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   178
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   179
module:hook("csi-client-active", function (event)
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   180
	local session = event.origin;
9926
06bf5ccd859f mod_csi_simple: Fix type in function name
Matthew Wild <mwild1@gmail.com>
parents: 9925
diff changeset
   181
	disable_optimizations(session);
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   182
end);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   183
10029
4498f601516d mod_csi_simple: Disable optimizations on disconnect (fixes #1358)
Kim Alvefur <zash@zash.se>
parents: 9927
diff changeset
   184
module:hook("pre-resource-unbind", function (event)
4498f601516d mod_csi_simple: Disable optimizations on disconnect (fixes #1358)
Kim Alvefur <zash@zash.se>
parents: 9927
diff changeset
   185
	local session = event.session;
4498f601516d mod_csi_simple: Disable optimizations on disconnect (fixes #1358)
Kim Alvefur <zash@zash.se>
parents: 9927
diff changeset
   186
	disable_optimizations(session);
10418
51ebfdeccad7 mod_csi_simple: Make sure to disable optimizations before mod_smacks (thanks pep.)
Kim Alvefur <zash@zash.se>
parents: 10307
diff changeset
   187
end, 1);
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   188
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   189
module:hook("c2s-ondrain", function (event)
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   190
	local session = event.session;
10281
45a58127a3e5 mod_csi_simple: Remove duplicated check for connection
Kim Alvefur <zash@zash.se>
parents: 10029
diff changeset
   191
	if session.state == "inactive" and session.conn and session.conn.pause_writes then
9927
e83dfcdeab59 mod_csi_simple: Include queue size in debug messages
Kim Alvefur <zash@zash.se>
parents: 9926
diff changeset
   192
		session.conn:pause_writes();
10833
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   193
		session.csi_measure_buffer_hold = measure_buffer_hold();
9927
e83dfcdeab59 mod_csi_simple: Include queue size in debug messages
Kim Alvefur <zash@zash.se>
parents: 9926
diff changeset
   194
		session.log("debug", "Buffer flushed, resuming inactive mode (queue size was %d)", session.csi_counter);
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   195
		session.csi_counter = 0;
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   196
	end
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   197
end);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   198
9923
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   199
function module.load()
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   200
	for _, user_session in pairs(prosody.hosts[module.host].sessions) do
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   201
		for _, session in pairs(user_session.sessions) do
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   202
			if session.state == "inactive" then
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   203
				enable_optimizations(session);
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   204
			end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   205
		end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   206
	end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   207
end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   208
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   209
function module.unload()
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   210
	for _, user_session in pairs(prosody.hosts[module.host].sessions) do
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   211
		for _, session in pairs(user_session.sessions) do
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   212
			if session.state == "inactive" then
9926
06bf5ccd859f mod_csi_simple: Fix type in function name
Matthew Wild <mwild1@gmail.com>
parents: 9925
diff changeset
   213
				disable_optimizations(session);
9923
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   214
			end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   215
		end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   216
	end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   217
end