plugins/mod_csi_simple.lua
author Kim Alvefur <zash@zash.se>
Sun, 24 Mar 2024 20:39:42 +0100
changeset 13466 720aed1f5cf2
parent 13217 50324f66ca2a
permissions -rw-r--r--
util.startup: Check root after detecting platform and reading config (thanks SigmaTel71) Ensures that startup.detect_platform() runs so know whether to use the POSIX method of checking the current user or something else. Also after reading the config so we know whether the root override setting is set.
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