annotate mod_presence_dedup/mod_presence_dedup.lua @ 2396:544ee057a23f

mod_storage_xmlarchive: Check if item exists before checking if its fields
author Kim Alvefur <zash@zash.se>
date Fri, 25 Nov 2016 23:08:18 +0100
parents f24b02e0d706
children 19924a2c4a48
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2155
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 local st = require "util.stanza";
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local cache = require "util.cache";
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local add_filter = require "util.filters".add_filter;
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 local cache_size = module:get_option_number("presence_dedup_cache_size", 100);
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 -- stanza equality tests
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 local function attr_eq(a, b)
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 if a == b then return true; end -- unlikely but not impossible
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 for k,v in pairs(a) do if b[k] ~= v then return false; end end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 for k,v in pairs(b) do if a[k] ~= v then return false; end end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 return true;
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 local function st_eq(a, b)
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 if a == b then return true; end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 if type(b) ~= "table" then return false; end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 if getmetatable(b) ~= st.stanza_mt then return false; end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 if a.name ~= b.name then return false; end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 if #a ~= #b then return false; end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 if not attr_eq(a.attr, b.attr) then return false; end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 for i = 1, #a do if not st_eq(a[i], b[i]) then return false; end end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 return true;
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 local function dedup_presence(stanza, session)
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 if session.presence_cache and session.presence
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 and getmetatable(stanza) == st.stanza_mt and stanza.name == "presence"
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 and stanza.attr.xmlns == nil and stanza.attr.from then
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 local cached = session.presence_cache:get(stanza.attr.from);
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 if st_eq(stanza, cached) then
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 return nil;
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 else
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 session.presence_cache:set(stanza.attr.from, st.clone(stanza));
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 return stanza;
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 end
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 module:hook("presence/initial", function (event)
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 local session, stanza = event.origin, event.stanza;
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 session.presence_cache = cache.new(cache_size);
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 add_filter(session, "stanzas/out", dedup_presence, 90);
f24b02e0d706 mod_presence_dedup: Attempt at saving bandwith by deduplicating presence stanzas
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 end);