# HG changeset patch # User Matthew Wild # Date 1635358323 -3600 # Node ID 1da4b815d2fe340d0efeff02035d2e870f00ab03 # Parent fae4e1335593c8c87f0e2b69a2c0e85a51f2d042 mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls This covers the following things: - A session that appears online, but has a broken TCP connection - Clients such as Siskin and Snikket iOS that require a push for calls to work It allows the stanza to be pushed immediately instead of waiting for the session to hibernate or an ack to timeout. It shouldn't break any existing cases. diff -r fae4e1335593 -r 1da4b815d2fe mod_cloud_notify/mod_cloud_notify.lua --- a/mod_cloud_notify/mod_cloud_notify.lua Wed Oct 27 14:07:07 2021 +0200 +++ b/mod_cloud_notify/mod_cloud_notify.lua Wed Oct 27 19:12:03 2021 +0100 @@ -253,6 +253,16 @@ end module:hook("iq-set/self/"..xmlns_push..":disable", push_disable); +-- urgent stanzas should be delivered without delay +local function is_urgent(stanza) + -- TODO + if stanza.name == "message" then + if stanza:get_child("propose", "urn:xmpp:jingle-message:0") then + return true, "jingle call"; + end + end +end + -- is this push a high priority one (this is needed for ios apps not using voip pushes) local function is_important(stanza) local st_name = stanza and stanza.name or nil; @@ -528,20 +538,31 @@ if event.for_user == to then local user_push_services = push_store:get(to); - -- only notify nodes with no active sessions (smacks is counted as active and handled separate) - local notify_push_services = {}; - for identifier, push_info in pairs(user_push_services) do - local identifier_found = nil; - for _, session in pairs(user_session) do - if session.push_identifier == identifier then - identifier_found = session; - break; + -- Urgent stanzas are time-sensitive (e.g. calls) and should + -- be pushed immediately to avoid getting stuck in the smacks + -- queue in case of dead connections, for example + local is_urgent_stanza, urgent_reason = is_urgent(event.stanza); + + local notify_push_services; + if is_urgent_stanza then + module:log("debug", "Urgent push for %s (%s)", to, urgent_reason); + notify_push_services = user_push_services; + else + -- only notify nodes with no active sessions (smacks is counted as active and handled separate) + notify_push_services = {}; + for identifier, push_info in pairs(user_push_services) do + local identifier_found = nil; + for _, session in pairs(user_session) do + if session.push_identifier == identifier then + identifier_found = session; + break; + end end - end - if identifier_found then - identifier_found.log("debug", "Not cloud notifying '%s' of new MAM stanza (session still alive)", identifier); - else - notify_push_services[identifier] = push_info; + if identifier_found then + identifier_found.log("debug", "Not cloud notifying '%s' of new MAM stanza (session still alive)", identifier); + else + notify_push_services[identifier] = push_info; + end end end