plugins/mod_csi_simple.lua
author Kim Alvefur <zash@zash.se>
Sat, 09 May 2020 13:50:58 +0200
changeset 10829 2d002a4af144
parent 10828 c8430ee33967
child 10830 4f7226d5ee30
permissions -rw-r--r--
mod_csi_simple: Fix flushing when client sent something Forgot to unset the flag afterwards, so it would only work once. The flag is not even needed, it works as intended without it.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10728
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
     1
-- Copyright (C) 2016-2020 Kim Alvefur
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
--
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
-- This project is MIT/X11 licensed. Please see the
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
-- COPYING file in the source package for more information.
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
--
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
module:depends"csi"
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
local jid = require "util.jid";
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
local st = require "util.stanza";
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
local dt = require "util.datetime";
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
    12
local filters = require "util.filters";
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
local queue_size = module:get_option_number("csi_queue_size", 256);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
10728
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    16
local important_payloads = module:get_option_set("csi_important_payloads", { });
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    17
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    18
function is_important(stanza) --> boolean, reason: string
9636
fdefc43bffff mod_csi_simple: Consider non-stanza objects important
Kim Alvefur <zash@zash.se>
parents: 9635
diff changeset
    19
	if not st.is_stanza(stanza) then
10775
c562edcf51bf mod_csi_simple: Clarify what might not be stanzas here
Kim Alvefur <zash@zash.se>
parents: 10774
diff changeset
    20
		-- whitespace pings etc
9636
fdefc43bffff mod_csi_simple: Consider non-stanza objects important
Kim Alvefur <zash@zash.se>
parents: 9635
diff changeset
    21
		return true;
fdefc43bffff mod_csi_simple: Consider non-stanza objects important
Kim Alvefur <zash@zash.se>
parents: 9635
diff changeset
    22
	end
10774
b4cbe72966c9 mod_csi_simple: Consider nonzas important
Kim Alvefur <zash@zash.se>
parents: 10773
diff changeset
    23
	if stanza.attr.xmlns ~= nil then
b4cbe72966c9 mod_csi_simple: Consider nonzas important
Kim Alvefur <zash@zash.se>
parents: 10773
diff changeset
    24
		-- stream errors, stream management etc
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    25
		return true, "nonza";
10774
b4cbe72966c9 mod_csi_simple: Consider nonzas important
Kim Alvefur <zash@zash.se>
parents: 10773
diff changeset
    26
	end
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
	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
    28
	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
    29
	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
    30
	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
    31
		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
    32
			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
    33
		end
10805
2b97aac0ea3c mod_csi_simple: Don't consider presence errors as important
Kim Alvefur <zash@zash.se>
parents: 10776
diff changeset
    34
		-- 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
    35
		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
    36
	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
    37
		if st_type == "headline" then
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    38
			-- Headline messages are ephemeral by definition
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    39
			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
    40
		end
10805
2b97aac0ea3c mod_csi_simple: Don't consider presence errors as important
Kim Alvefur <zash@zash.se>
parents: 10776
diff changeset
    41
		if st_type == "error" then
10811
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    42
			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
    43
		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
    44
		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
    45
			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
    46
		end
9773
150e9574c149 mod_csi_simple: Unpack Carbons-forwarded messages (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9772
diff changeset
    47
		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
    48
		if forwarded then
150e9574c149 mod_csi_simple: Unpack Carbons-forwarded messages (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9772
diff changeset
    49
			stanza = forwarded;
150e9574c149 mod_csi_simple: Unpack Carbons-forwarded messages (fixes part of #1250)
Kim Alvefur <zash@zash.se>
parents: 9772
diff changeset
    50
		end
9771
57ceffb13963 mod_csi_simple: Tweak check for <body>
Kim Alvefur <zash@zash.se>
parents: 9655
diff changeset
    51
		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
    52
			return true, "body";
9771
57ceffb13963 mod_csi_simple: Tweak check for <body>
Kim Alvefur <zash@zash.se>
parents: 9655
diff changeset
    53
		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
    54
		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
    55
			-- Last step of a MUC join
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    56
			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
    57
		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
    58
		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
    59
			-- 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
    60
			-- XXX Experimental XEP
b92afa0a4119 mod_csi_simple: Add short reasons to report
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
    61
			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
    62
		end
10737
89e0f5cb60a1 mod_csi_simple: Consider MUC invites important
Kim Alvefur <zash@zash.se>
parents: 10728
diff changeset
    63
		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
    64
			return true, "invite";
10737
89e0f5cb60a1 mod_csi_simple: Consider MUC invites important
Kim Alvefur <zash@zash.se>
parents: 10728
diff changeset
    65
		end
10826
af42448a8e98 mod_csi_simple: Fix unintentional order of rules from merge
Kim Alvefur <zash@zash.se>
parents: 10821
diff changeset
    66
		if stanza:get_child(nil, "urn:xmpp:jingle-message:0") then
10827
b8be600803ee mod_csi_simple: Add comment highlighting that XEP-0353 is experimental
Kim Alvefur <zash@zash.se>
parents: 10826
diff changeset
    67
			-- XXX Experimental XEP stuck in Proposed for almost a year at the time of this comment
10826
af42448a8e98 mod_csi_simple: Fix unintentional order of rules from merge
Kim Alvefur <zash@zash.se>
parents: 10821
diff changeset
    68
			return true, "jingle call";
af42448a8e98 mod_csi_simple: Fix unintentional order of rules from merge
Kim Alvefur <zash@zash.se>
parents: 10821
diff changeset
    69
		end
10728
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    70
		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
    71
			if stanza:find(important) then
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    72
				return true;
7835b9f14cb8 mod_csi_simple: Allow configuring extra tags indicating importance
Kim Alvefur <zash@zash.se>
parents: 10418
diff changeset
    73
			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
    74
		end
9771
57ceffb13963 mod_csi_simple: Tweak check for <body>
Kim Alvefur <zash@zash.se>
parents: 9655
diff changeset
    75
		return false;
10776
31e702c5f475 mod_csi_simple: Explicitly mention iq stanzas
Kim Alvefur <zash@zash.se>
parents: 10775
diff changeset
    76
	elseif st_name == "iq" then
31e702c5f475 mod_csi_simple: Explicitly mention iq stanzas
Kim Alvefur <zash@zash.se>
parents: 10775
diff changeset
    77
		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
    78
	end
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    79
end
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    80
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    81
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
    82
	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
    83
	event.reason = why;
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    84
	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
    85
end, -1);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    86
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    87
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
    88
	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
    89
		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
    90
	end
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    91
	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
    92
	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
    93
	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
    94
end
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
    95
9915
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
    96
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
    97
	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
    98
		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
    99
		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
   100
	end
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
   101
	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
   102
end
ed011935c22d mod_csi_simple: Break out stanza timestamping into a function for future reuse
Kim Alvefur <zash@zash.se>
parents: 9913
diff changeset
   103
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   104
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
   105
	local ctr = session.csi_counter or 0;
10810
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
   106
	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
   107
	if flush then
24e2b571d29a mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents: 10805
diff changeset
   108
		session.log("debug", "Flushing buffer (%s; queue size is %d)", why or "important", session.csi_counter);
9916
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   109
		session.conn:resume_writes();
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   110
	else
10812
0d365c0ee9fe mod_csi_simple: Log reasons for not flushing
Kim Alvefur <zash@zash.se>
parents: 10811
diff changeset
   111
		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
   112
		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
   113
	end
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   114
	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
   115
	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
   116
end
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   117
9917
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   118
local function flush_buffer(data, session)
9927
e83dfcdeab59 mod_csi_simple: Include queue size in debug messages
Kim Alvefur <zash@zash.se>
parents: 9926
diff changeset
   119
	session.log("debug", "Client sent something, flushing buffer once (queue size is %d)", session.csi_counter);
9917
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   120
	session.conn:resume_writes();
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   121
	return data;
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   122
end
7d78b24d8449 mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents: 9916
diff changeset
   123
9922
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   124
function enable_optimizations(session)
10281
45a58127a3e5 mod_csi_simple: Remove duplicated check for connection
Kim Alvefur <zash@zash.se>
parents: 10029
diff changeset
   125
	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
   126
		session.conn:pause_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
   127
		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
   128
		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
   129
	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
   130
		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
   131
	end
9922
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   132
end
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   133
9926
06bf5ccd859f mod_csi_simple: Fix type in function name
Matthew Wild <mwild1@gmail.com>
parents: 9925
diff changeset
   134
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
   135
	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
   136
	filters.remove_filter(session, "bytes/in", flush_buffer);
10281
45a58127a3e5 mod_csi_simple: Remove duplicated check for connection
Kim Alvefur <zash@zash.se>
parents: 10029
diff changeset
   137
	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
   138
		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
   139
	end
9922
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   140
end
6e9dcec259d0 mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents: 9921
diff changeset
   141
9592
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   142
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
   143
	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
   144
	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
   145
end);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   146
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   147
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
   148
	local session = event.origin;
9926
06bf5ccd859f mod_csi_simple: Fix type in function name
Matthew Wild <mwild1@gmail.com>
parents: 9925
diff changeset
   149
	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
   150
end);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   151
10029
4498f601516d mod_csi_simple: Disable optimizations on disconnect (fixes #1358)
Kim Alvefur <zash@zash.se>
parents: 9927
diff changeset
   152
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
   153
	local session = event.session;
4498f601516d mod_csi_simple: Disable optimizations on disconnect (fixes #1358)
Kim Alvefur <zash@zash.se>
parents: 9927
diff changeset
   154
	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
   155
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
   156
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   157
module:hook("c2s-ondrain", function (event)
601f9781a605 mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
   158
	local session = event.session;
10281
45a58127a3e5 mod_csi_simple: Remove duplicated check for connection
Kim Alvefur <zash@zash.se>
parents: 10029
diff changeset
   159
	if session.state == "inactive" and session.conn and session.conn.pause_writes then
9927
e83dfcdeab59 mod_csi_simple: Include queue size in debug messages
Kim Alvefur <zash@zash.se>
parents: 9926
diff changeset
   160
		session.conn:pause_writes();
e83dfcdeab59 mod_csi_simple: Include queue size in debug messages
Kim Alvefur <zash@zash.se>
parents: 9926
diff changeset
   161
		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
   162
		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
   163
	end
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   164
end);
aeb054ee88c5 mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   165
9923
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   166
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
   167
	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
   168
		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
   169
			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
   170
				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
   171
			end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   172
		end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   173
	end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   174
end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   175
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   176
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
   177
	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
   178
		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
   179
			if session.state == "inactive" then
9926
06bf5ccd859f mod_csi_simple: Fix type in function name
Matthew Wild <mwild1@gmail.com>
parents: 9925
diff changeset
   180
				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
   181
			end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   182
		end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   183
	end
d602a495409b mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents: 9922
diff changeset
   184
end