author | Kim Alvefur <zash@zash.se> |
Sat, 09 May 2020 17:45:45 +0200 | |
changeset 10833 | 67a09706e56e |
parent 10832 | c12ed21f877e |
child 10834 | 8889d5037aca |
permissions | -rw-r--r-- |
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 |
|
10833
67a09706e56e
mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents:
10832
diff
changeset
|
104 |
local measure_buffer_hold = module:measure("buffer_hold", "times"); |
67a09706e56e
mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents:
10832
diff
changeset
|
105 |
|
9916
601f9781a605
mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents:
9915
diff
changeset
|
106 |
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
|
107 |
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
|
108 |
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
|
109 |
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
|
110 |
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
|
111 |
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
|
112 |
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
|
113 |
end |
10810
24e2b571d29a
mod_csi_simple: Refactor to allow logging reason for buffer flush
Kim Alvefur <zash@zash.se>
parents:
10805
diff
changeset
|
114 |
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
|
115 |
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
|
116 |
else |
10812
0d365c0ee9fe
mod_csi_simple: Log reasons for not flushing
Kim Alvefur <zash@zash.se>
parents:
10811
diff
changeset
|
117 |
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
|
118 |
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
|
119 |
end |
601f9781a605
mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents:
9915
diff
changeset
|
120 |
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
|
121 |
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
|
122 |
end |
601f9781a605
mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents:
9915
diff
changeset
|
123 |
|
9917
7d78b24d8449
mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents:
9916
diff
changeset
|
124 |
local function flush_buffer(data, session) |
10832
c12ed21f877e
mod_csi_simple: Change debug message of client-triggered flush for coherence
Kim Alvefur <zash@zash.se>
parents:
10831
diff
changeset
|
125 |
session.log("debug", "Flushing buffer (%s; queue size is %d)", "client activity", session.csi_counter); |
10833
67a09706e56e
mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents:
10832
diff
changeset
|
126 |
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
|
127 |
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
|
128 |
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
|
129 |
end |
9917
7d78b24d8449
mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents:
9916
diff
changeset
|
130 |
session.conn:resume_writes(); |
7d78b24d8449
mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents:
9916
diff
changeset
|
131 |
return data; |
7d78b24d8449
mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents:
9916
diff
changeset
|
132 |
end |
7d78b24d8449
mod_csi_simple: Trigger buffer flush on seeing incoming data
Kim Alvefur <zash@zash.se>
parents:
9916
diff
changeset
|
133 |
|
9922
6e9dcec259d0
mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents:
9921
diff
changeset
|
134 |
function enable_optimizations(session) |
10281
45a58127a3e5
mod_csi_simple: Remove duplicated check for connection
Kim Alvefur <zash@zash.se>
parents:
10029
diff
changeset
|
135 |
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
|
136 |
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
|
137 |
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
|
138 |
session.csi_counter = 0; |
9916
601f9781a605
mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents:
9915
diff
changeset
|
139 |
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
|
140 |
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
|
141 |
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
|
142 |
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
|
143 |
end |
9922
6e9dcec259d0
mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents:
9921
diff
changeset
|
144 |
end |
9592
aeb054ee88c5
mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
145 |
|
9926
06bf5ccd859f
mod_csi_simple: Fix type in function name
Matthew Wild <mwild1@gmail.com>
parents:
9925
diff
changeset
|
146 |
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
|
147 |
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
|
148 |
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
|
149 |
session.csi_counter = nil; |
10833
67a09706e56e
mod_csi_simple: Record stats of how long buffers are held
Kim Alvefur <zash@zash.se>
parents:
10832
diff
changeset
|
150 |
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
|
151 |
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
|
152 |
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
|
153 |
end |
10281
45a58127a3e5
mod_csi_simple: Remove duplicated check for connection
Kim Alvefur <zash@zash.se>
parents:
10029
diff
changeset
|
154 |
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
|
155 |
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
|
156 |
end |
9922
6e9dcec259d0
mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents:
9921
diff
changeset
|
157 |
end |
6e9dcec259d0
mod_csi_simple: Separate out functions to enable/disable optimizations
Kim Alvefur <zash@zash.se>
parents:
9921
diff
changeset
|
158 |
|
9592
aeb054ee88c5
mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
159 |
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
|
160 |
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
|
161 |
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
|
162 |
end); |
aeb054ee88c5
mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
163 |
|
aeb054ee88c5
mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
164 |
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
|
165 |
local session = event.origin; |
9926
06bf5ccd859f
mod_csi_simple: Fix type in function name
Matthew Wild <mwild1@gmail.com>
parents:
9925
diff
changeset
|
166 |
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
|
167 |
end); |
aeb054ee88c5
mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
168 |
|
10029
4498f601516d
mod_csi_simple: Disable optimizations on disconnect (fixes #1358)
Kim Alvefur <zash@zash.se>
parents:
9927
diff
changeset
|
169 |
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
|
170 |
local session = event.session; |
4498f601516d
mod_csi_simple: Disable optimizations on disconnect (fixes #1358)
Kim Alvefur <zash@zash.se>
parents:
9927
diff
changeset
|
171 |
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
|
172 |
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
|
173 |
|
601f9781a605
mod_csi_simple: Count buffered items and flush when it reaches configured limit
Kim Alvefur <zash@zash.se>
parents:
9915
diff
changeset
|
174 |
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
|
175 |
local session = event.session; |
10281
45a58127a3e5
mod_csi_simple: Remove duplicated check for connection
Kim Alvefur <zash@zash.se>
parents:
10029
diff
changeset
|
176 |
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
|
177 |
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
|
178 |
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
|
179 |
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
|
180 |
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
|
181 |
end |
aeb054ee88c5
mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
182 |
end); |
aeb054ee88c5
mod_csi_simple: Import modified version of mod_csi_pump from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
183 |
|
9923
d602a495409b
mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents:
9922
diff
changeset
|
184 |
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
|
185 |
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
|
186 |
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
|
187 |
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
|
188 |
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
|
189 |
end |
d602a495409b
mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents:
9922
diff
changeset
|
190 |
end |
d602a495409b
mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents:
9922
diff
changeset
|
191 |
end |
d602a495409b
mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents:
9922
diff
changeset
|
192 |
end |
d602a495409b
mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents:
9922
diff
changeset
|
193 |
|
d602a495409b
mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents:
9922
diff
changeset
|
194 |
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
|
195 |
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
|
196 |
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
|
197 |
if session.state == "inactive" then |
9926
06bf5ccd859f
mod_csi_simple: Fix type in function name
Matthew Wild <mwild1@gmail.com>
parents:
9925
diff
changeset
|
198 |
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
|
199 |
end |
d602a495409b
mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents:
9922
diff
changeset
|
200 |
end |
d602a495409b
mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents:
9922
diff
changeset
|
201 |
end |
d602a495409b
mod_csi_simple: Disable optimizations on unload and re-enable on load
Kim Alvefur <zash@zash.se>
parents:
9922
diff
changeset
|
202 |
end |