plugins/mod_csi_simple.lua
author Matthew Wild <mwild1@gmail.com>
Sun, 17 Mar 2024 10:10:24 +0000
changeset 13464 a688947fab1e
parent 13217 50324f66ca2a
permissions -rw-r--r--
mod_bosh: Set base_type on session This fixes a traceback with mod_saslauth. Ideally we move this to util.session at some point, though.
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
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12556
diff changeset
     9
local jid = require "prosody.util.jid";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12556
diff changeset
    10
local st = require "prosody.util.stanza";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12556
diff changeset
    11
local dt = require "prosody.util.datetime";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12556
diff changeset
    12
local filters = require "prosody.util.filters";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12556
diff changeset
    13
local timer = require "prosody.util.timer";
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
13217
50324f66ca2a plugins: Use integer config API with interval specification where sensible
Kim Alvefur <zash@zash.se>
parents: 13213
diff changeset
    15
local queue_size = module:get_option_integer("csi_queue_size", 256, 1);
13213
c8d949cf6b09 plugins: Switch to :get_option_period() for time range options
Kim Alvefur <zash@zash.se>
parents: 13096
diff changeset
    16
local resume_delay = module:get_option_period("csi_resume_inactive_delay", 5);
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
10728
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    18
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
    19
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    20
function is_important(stanza) --> boolean, reason: string
10836
7395f6e68dba mod_csi_simple: Report whitespace keepalives
Kim Alvefur <zash@zash.se>
parents: 10835
diff changeset
    21
	if stanza == " " then
7395f6e68dba mod_csi_simple: Report whitespace keepalives
Kim Alvefur <zash@zash.se>
parents: 10835
diff changeset
    22
		return true, "whitespace keepalive";
7395f6e68dba mod_csi_simple: Report whitespace keepalives
Kim Alvefur <zash@zash.se>
parents: 10835
diff changeset
    23
	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
    24
		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
    25
	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
    26
		-- 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
    27
		return true, type(stanza);
9636
fdefc43bffff mod_csi_simple: Consider non-stanza objects important
Kim Alvefur <zash@zash.se>
parents: 9635
diff changeset
    28
	end
10774
b4cbe72966c9 mod_csi_simple: Consider nonzas important
Kim Alvefur <zash@zash.se>
parents: 10773
diff changeset
    29
	if stanza.attr.xmlns ~= nil then
b4cbe72966c9 mod_csi_simple: Consider nonzas important
Kim Alvefur <zash@zash.se>
parents: 10773
diff changeset
    30
		-- stream errors, stream management etc
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    31
		return true, "nonza";
10774
b4cbe72966c9 mod_csi_simple: Consider nonzas important
Kim Alvefur <zash@zash.se>
parents: 10773
diff changeset
    32
	end
9592
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_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
    34
	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
    35
	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
    36
	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
    37
		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
    38
			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
    39
		end
10805
2b97aac0ea3c mod_csi_simple: Don't consider presence errors as important
Kim Alvefur <zash@zash.se>
parents: 10776
diff changeset
    40
		-- 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
    41
		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
    42
	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
    43
		if st_type == "headline" then
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    44
			-- Headline messages are ephemeral by definition
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    45
			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
    46
		end
10805
2b97aac0ea3c mod_csi_simple: Don't consider presence errors as important
Kim Alvefur <zash@zash.se>
parents: 10776
diff changeset
    47
		if st_type == "error" then
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    48
			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
    49
		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
    50
		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
    51
			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
    52
		end
9773
150e9574c149 mod_csi_simple: Unpack Carbons-forwarded messages (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9772
diff changeset
    53
		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
    54
		if forwarded then
150e9574c149 mod_csi_simple: Unpack Carbons-forwarded messages (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9772
diff changeset
    55
			stanza = forwarded;
150e9574c149 mod_csi_simple: Unpack Carbons-forwarded messages (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9772
diff changeset
    56
		end
9771
57ceffb13963 mod_csi_simple: Tweak check for <body>
Kim Alvefur <zash@zash.se>
parents: 9655
diff changeset
    57
		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
    58
			return true, "body";
9771
57ceffb13963 mod_csi_simple: Tweak check for <body>
Kim Alvefur <zash@zash.se>
parents: 9655
diff changeset
    59
		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
    60
		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
    61
			-- Last step of a MUC join
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    62
			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
    63
		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
    64
		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
    65
			-- 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
    66
			-- XXX Experimental XEP
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    67
			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
    68
		end
10737
89e0f5cb60a1 mod_csi_simple: Consider MUC invites important
Kim Alvefur <zash@zash.se>
parents: 10728
diff changeset
    69
		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
    70
			return true, "invite";
10737
89e0f5cb60a1 mod_csi_simple: Consider MUC invites important
Kim Alvefur <zash@zash.se>
parents: 10728
diff changeset
    71
		end
12238
1c47162dd965 plugins: Update for namespace bump in XEP-0353 v0.4.0
Kim Alvefur <zash@zash.se>
parents: 11932
diff changeset
    72
		if stanza:get_child(nil, "urn:xmpp:jingle-message:0") or stanza:get_child(nil, "urn:xmpp:jingle-message:1") then
11264
08b397c21805 mod_csi_simple,mod_carbons,mod_mam: Update comment about XEP-0353
Kim Alvefur <zash@zash.se>
parents: 10837
diff changeset
    73
			-- XXX Experimental XEP
10826
af42448a8e98 mod_csi_simple: Fix unintentional order of rules from merge
Kim Alvefur <zash@zash.se>
parents: 10821
diff changeset
    74
			return true, "jingle call";
af42448a8e98 mod_csi_simple: Fix unintentional order of rules from merge
Kim Alvefur <zash@zash.se>
parents: 10821
diff changeset
    75
		end
10728
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    76
		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
    77
			if stanza:find(important) then
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    78
				return true;
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    79
			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
    80
		end
9771
57ceffb13963 mod_csi_simple: Tweak check for <body>
Kim Alvefur <zash@zash.se>
parents: 9655
diff changeset
    81
		return false;
10776
31e702c5f475 mod_csi_simple: Explicitly mention iq stanzas
Kim Alvefur <zash@zash.se>
parents: 10775
diff changeset
    82
	elseif st_name == "iq" then
31e702c5f475 mod_csi_simple: Explicitly mention iq stanzas
Kim Alvefur <zash@zash.se>
parents: 10775
diff changeset
    83
		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
    84
	end
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    85
end
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    86
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    87
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
    88
	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
    89
	event.reason = why;
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    90
	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
    91
end, -1);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    92
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    93
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
    94
	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
    95
		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
    96
	end
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    97
	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
    98
	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
    99
	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
   100
end
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
   101
9915
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
   102
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
   103
	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
   104
		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
   105
		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
   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
	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
   108
end
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
   109
11838
f54d9abc4e14 mod_csi_simple: Provide custom set of timing buckets
Kim Alvefur <zash@zash.se>
parents: 11577
diff changeset
   110
local measure_buffer_hold = module:measure("buffer_hold", "times",
f54d9abc4e14 mod_csi_simple: Provide custom set of timing buckets
Kim Alvefur <zash@zash.se>
parents: 11577
diff changeset
   111
	{ buckets = { 0.1; 1; 5; 10; 15; 30; 60; 120; 180; 300; 600; 900 } });
10833
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   112
11577
cb5748f94840 mod_csi_simple: convert to use new metric interface for flush reasons
Jonas Schäfer <jonas@wielicki.name>
parents: 11429
diff changeset
   113
local flush_reasons = module:metric(
cb5748f94840 mod_csi_simple: convert to use new metric interface for flush reasons
Jonas Schäfer <jonas@wielicki.name>
parents: 11429
diff changeset
   114
	"counter", "flushes", "",
cb5748f94840 mod_csi_simple: convert to use new metric interface for flush reasons
Jonas Schäfer <jonas@wielicki.name>
parents: 11429
diff changeset
   115
	"CSI queue flushes",
cb5748f94840 mod_csi_simple: convert to use new metric interface for flush reasons
Jonas Schäfer <jonas@wielicki.name>
parents: 11429
diff changeset
   116
	{ "reason" }
cb5748f94840 mod_csi_simple: convert to use new metric interface for flush reasons
Jonas Schäfer <jonas@wielicki.name>
parents: 11429
diff changeset
   117
);
10834
8889d5037aca mod_csi_simple: Collect stats on flush reasons
Kim Alvefur <zash@zash.se>
parents: 10833
diff changeset
   118
12556
b4bc5a715e65 mod_csi_simple: Collect stats on number of stanzas per flush
Kim Alvefur <zash@zash.se>
parents: 12238
diff changeset
   119
local flush_sizes = module:metric("histogram", "flush_stanza_count", "", "Number of stanzas flushed at once", {},
b4bc5a715e65 mod_csi_simple: Collect stats on number of stanzas per flush
Kim Alvefur <zash@zash.se>
parents: 12238
diff changeset
   120
	{ buckets = { 0, 1, 2, 4, 8, 16, 32, 64, 128, 256 } }):with_labels();
b4bc5a715e65 mod_csi_simple: Collect stats on number of stanzas per flush
Kim Alvefur <zash@zash.se>
parents: 12238
diff changeset
   121
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   122
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
   123
	local ctr = session.csi_counter or 0;
11918
8f7946ce7d66 mod_csi_simple: Only act in inactive mode to prevent infinite recursion
Kim Alvefur <zash@zash.se>
parents: 11917
diff changeset
   124
	if session.state ~= "inactive" then
8f7946ce7d66 mod_csi_simple: Only act in inactive mode to prevent infinite recursion
Kim Alvefur <zash@zash.se>
parents: 11917
diff changeset
   125
		session.csi_counter = ctr + 1;
8f7946ce7d66 mod_csi_simple: Only act in inactive mode to prevent infinite recursion
Kim Alvefur <zash@zash.se>
parents: 11917
diff changeset
   126
		return stanza;
8f7946ce7d66 mod_csi_simple: Only act in inactive mode to prevent infinite recursion
Kim Alvefur <zash@zash.se>
parents: 11917
diff changeset
   127
	end
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
   128
	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
   129
	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
   130
		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
   131
			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
   132
			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
   133
		end
11577
cb5748f94840 mod_csi_simple: convert to use new metric interface for flush reasons
Jonas Schäfer <jonas@wielicki.name>
parents: 11429
diff changeset
   134
		flush_reasons:with_labels(why or "important"):add(1);
12556
b4bc5a715e65 mod_csi_simple: Collect stats on number of stanzas per flush
Kim Alvefur <zash@zash.se>
parents: 12238
diff changeset
   135
		flush_sizes:sample(ctr);
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
   136
		session.log("debug", "Flushing buffer (%s; queue size is %d)", why or "important", session.csi_counter);
11383
5c820553ef82 mod_csi_simple: Set session state to 'flushing' while doing so
Kim Alvefur <zash@zash.se>
parents: 11264
diff changeset
   137
		session.state = "flushing";
11384
9a1758c5aaa4 mod_csi_simple: Fire event when flushing queue
Kim Alvefur <zash@zash.se>
parents: 11383
diff changeset
   138
		module:fire_event("csi-flushing", { session = session });
11917
75d69e4c54a2 mod_csi_simple: Unlock writes after event, to allow things to be queued
Kim Alvefur <zash@zash.se>
parents: 11838
diff changeset
   139
		session.conn:resume_writes();
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   140
	else
10812
0d365c0ee9fe mod_csi_simple: Log reasons for not flushing
Kim Alvefur <zash@zash.se>
parents: 10811
diff changeset
   141
		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
   142
		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
   143
	end
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   144
	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
   145
	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
   146
end
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   147
9917
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   148
local function flush_buffer(data, session)
11923
fae5441fc6cf mod_csi_simple: Skip flushing of empty buffer
Kim Alvefur <zash@zash.se>
parents: 11922
diff changeset
   149
	local ctr = session.csi_counter or 0;
11932
16cf863b36c0 mod_csi_simple: Skip initiating flush in all but inactive state
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
   150
	if ctr == 0 or session.state ~= "inactive" then return data end
10832
c12ed21f877e mod_csi_simple: Change debug message of client-triggered flush for coherence
Kim Alvefur <zash@zash.se>
parents: 10831
diff changeset
   151
	session.log("debug", "Flushing buffer (%s; queue size is %d)", "client activity", session.csi_counter);
11922
2dc3bc5e137a mod_csi_simple: Fire event when flushing due to client activity
Kim Alvefur <zash@zash.se>
parents: 11920
diff changeset
   152
	session.state = "flushing";
2dc3bc5e137a mod_csi_simple: Fire event when flushing due to client activity
Kim Alvefur <zash@zash.se>
parents: 11920
diff changeset
   153
	module:fire_event("csi-flushing", { session = session });
12556
b4bc5a715e65 mod_csi_simple: Collect stats on number of stanzas per flush
Kim Alvefur <zash@zash.se>
parents: 12238
diff changeset
   154
	flush_sizes:sample(ctr);
11577
cb5748f94840 mod_csi_simple: convert to use new metric interface for flush reasons
Jonas Schäfer <jonas@wielicki.name>
parents: 11429
diff changeset
   155
	flush_reasons:with_labels("client activity"):add(1);
10833
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   156
	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
   157
		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
   158
		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
   159
	end
9917
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   160
	session.conn:resume_writes();
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   161
	return data;
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   162
end
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   163
9922
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   164
function enable_optimizations(session)
10281
45a58127a3e5 mod_csi_simple: Remove duplicated check for connection
Kim Alvefur <zash@zash.se>
parents: 10029
diff changeset
   165
	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
   166
		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
   167
		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
   168
		session.csi_counter = 0;
13095
214a679823e8 mod_csi_simple: Disable revert-to-inactive timer when going to active mode
Kim Alvefur <zash@zash.se>
parents: 13094
diff changeset
   169
		if session.csi_resume then
214a679823e8 mod_csi_simple: Disable revert-to-inactive timer when going to active mode
Kim Alvefur <zash@zash.se>
parents: 13094
diff changeset
   170
			timer.stop(session.csi_resume);
214a679823e8 mod_csi_simple: Disable revert-to-inactive timer when going to active mode
Kim Alvefur <zash@zash.se>
parents: 13094
diff changeset
   171
			session.csi_resume = nil;
214a679823e8 mod_csi_simple: Disable revert-to-inactive timer when going to active mode
Kim Alvefur <zash@zash.se>
parents: 13094
diff changeset
   172
		end
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   173
		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
   174
		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
   175
	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
   176
		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
   177
	end
9922
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   178
end
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   179
9926
06bf5ccd859f mod_csi_simple: Fix type in function name
Matthew Wild <mwild1@gmail.com>
parents: 9925
diff changeset
   180
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
   181
	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
   182
	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
   183
	session.csi_counter = nil;
13094
3cea237f9d1d mod_csi_simple: Clear delayed active mode timer on disable
Kim Alvefur <zash@zash.se>
parents: 12238
diff changeset
   184
	if session.csi_resume then
3cea237f9d1d mod_csi_simple: Clear delayed active mode timer on disable
Kim Alvefur <zash@zash.se>
parents: 12238
diff changeset
   185
		timer.stop(session.csi_resume);
3cea237f9d1d mod_csi_simple: Clear delayed active mode timer on disable
Kim Alvefur <zash@zash.se>
parents: 12238
diff changeset
   186
		session.csi_resume = nil;
3cea237f9d1d mod_csi_simple: Clear delayed active mode timer on disable
Kim Alvefur <zash@zash.se>
parents: 12238
diff changeset
   187
	end
10833
67a09706e56e mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents: 10832
diff changeset
   188
	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
   189
		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
   190
		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
   191
	end
10281
45a58127a3e5 mod_csi_simple: Remove duplicated check for connection
Kim Alvefur <zash@zash.se>
parents: 10029
diff changeset
   192
	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
   193
		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
   194
	end
9922
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   195
end
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   196
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   197
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
   198
	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
   199
	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
   200
end);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   201
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   202
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
   203
	local session = event.origin;
9926
06bf5ccd859f mod_csi_simple: Fix type in function name
Matthew Wild <mwild1@gmail.com>
parents: 9925
diff changeset
   204
	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
   205
end);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   206
10029
4498f601516d mod_csi_simple: Disable optimizations on disconnect (fixes #1358)
Kim Alvefur <zash@zash.se>
parents: 9927
diff changeset
   207
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
   208
	local session = event.session;
4498f601516d mod_csi_simple: Disable optimizations on disconnect (fixes #1358)
Kim Alvefur <zash@zash.se>
parents: 9927
diff changeset
   209
	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
   210
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
   211
11930
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   212
local function resume_optimizations(_, _, session)
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   213
	if (session.state == "flushing" or session.state == "inactive")  and session.conn and session.conn.pause_writes then
11383
5c820553ef82 mod_csi_simple: Set session state to 'flushing' while doing so
Kim Alvefur <zash@zash.se>
parents: 11264
diff changeset
   214
		session.state = "inactive";
9927
e83dfcdeab59 mod_csi_simple: Include queue size in debug messages
Kim Alvefur <zash@zash.se>
parents: 9926
diff changeset
   215
		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
   216
		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
   217
		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
   218
		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
   219
	end
11930
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   220
	session.csi_resume = nil;
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   221
end
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   222
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   223
module:hook("c2s-ondrain", function (event)
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   224
	local session = event.session;
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   225
	if (session.state == "flushing" or session.state == "inactive")  and session.conn and session.conn.pause_writes then
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   226
		-- After flushing, remain in pseudo-flushing state for a moment to allow
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   227
		-- some followup traffic, iq replies, smacks acks to be sent without having
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   228
		-- to go back and forth between inactive and flush mode.
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   229
		if not session.csi_resume then
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   230
			session.csi_resume = timer.add_task(resume_delay, resume_optimizations, session);
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   231
		end
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   232
		-- Should further noise in this short grace period push back the delay?
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   233
		-- Probably not great if the session can be kept in pseudo-active mode
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   234
		-- indefinitely.
99444bf26a3d mod_csi_simple: Allow some straggler traffic after flushing buffer
Kim Alvefur <zash@zash.se>
parents: 11923
diff changeset
   235
	end
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   236
end);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   237
9923
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   238
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
   239
	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
   240
		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
   241
			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
   242
				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
   243
			end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   244
		end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   245
	end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   246
end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   247
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   248
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
   249
	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
   250
		for _, session in pairs(user_session.sessions) do
11920
5dae9262f81f mod_csi_simple: Detach cleanly from sessions if unloaded while flushing
Kim Alvefur <zash@zash.se>
parents: 11918
diff changeset
   251
			if session.state and session.state ~= "active" then
9926
06bf5ccd859f mod_csi_simple: Fix type in function name
Matthew Wild <mwild1@gmail.com>
parents: 9925
diff changeset
   252
				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
   253
			end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   254
		end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   255
	end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   256
end
11405
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   257
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   258
function module.command(arg)
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   259
	if arg[1] ~= "test" then
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   260
		print("Usage: "..module.name.." test < test-stream.xml")
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   261
		print("");
11429
fc7706fe115d mod_csi_simple: s/algoritm/algorithm/ [codespell]
Kim Alvefur <zash@zash.se>
parents: 11405
diff changeset
   262
		print("Provide a series of stanzas to test against importance algorithm");
11405
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   263
		return 1;
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   264
	end
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   265
	-- luacheck: ignore 212/self
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12556
diff changeset
   266
	local xmppstream = require "prosody.util.xmppstream";
11405
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   267
	local input_session = { notopen = true }
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   268
	local stream_callbacks = { stream_ns = "jabber:client", default_ns = "jabber:client" };
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   269
	function stream_callbacks:handlestanza(stanza)
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   270
		local important, because = is_important(stanza);
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   271
		print("--");
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   272
		print(stanza:indent(nil, "  "));
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   273
		-- :pretty_print() maybe?
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   274
		if important then
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   275
			print((because or "unspecified reason").. " -> important");
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   276
		else
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   277
			print((because or "unspecified reason").. " -> unimportant");
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   278
		end
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   279
	end
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   280
	local input_stream = xmppstream.new(input_session, stream_callbacks);
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   281
	input_stream:reset();
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   282
	input_stream:feed(st.stanza("stream", { xmlns = "jabber:client" }):top_tag());
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   283
	input_session.notopen = nil;
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   284
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   285
	for line in io.lines() do
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   286
		input_stream:feed(line);
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   287
	end
228bd43fbc3d mod_csi_simple: Add command to test importance algorithm on stream of stanzas
Kim Alvefur <zash@zash.se>
parents: 11384
diff changeset
   288
end