Mercurial > prosody-modules
comparison mod_smacks/mod_smacks.lua @ 1343:7dbde05b48a9
all the things: Remove trailing whitespace
| author | Florian Zeitz <florob@babelmonkeys.de> |
|---|---|
| date | Tue, 11 Mar 2014 18:44:01 +0100 |
| parents | b21236b6b8d8 |
| children | 26a2092e289f |
comparison
equal
deleted
inserted
replaced
| 1342:0ae065453dc9 | 1343:7dbde05b48a9 |
|---|---|
| 26 local c2s_sessions = module:shared("/*/c2s/sessions"); | 26 local c2s_sessions = module:shared("/*/c2s/sessions"); |
| 27 local session_registry = {}; | 27 local session_registry = {}; |
| 28 | 28 |
| 29 local function can_do_smacks(session, advertise_only) | 29 local function can_do_smacks(session, advertise_only) |
| 30 if session.smacks then return false, "unexpected-request", "Stream management is already enabled"; end | 30 if session.smacks then return false, "unexpected-request", "Stream management is already enabled"; end |
| 31 | 31 |
| 32 local session_type = session.type; | 32 local session_type = session.type; |
| 33 if session_type == "c2s" then | 33 if session_type == "c2s" then |
| 34 if not(advertise_only) and not(session.resource) then -- Fail unless we're only advertising sm | 34 if not(advertise_only) and not(session.resource) then -- Fail unless we're only advertising sm |
| 35 return false, "unexpected-request", "Client must bind a resource before enabling stream management"; | 35 return false, "unexpected-request", "Client must bind a resource before enabling stream management"; |
| 36 end | 36 end |
| 77 session.outgoing_stanza_queue = queue; | 77 session.outgoing_stanza_queue = queue; |
| 78 session.last_acknowledged_stanza = 0; | 78 session.last_acknowledged_stanza = 0; |
| 79 else | 79 else |
| 80 queue = session.outgoing_stanza_queue; | 80 queue = session.outgoing_stanza_queue; |
| 81 end | 81 end |
| 82 | 82 |
| 83 local _send = session.sends2s or session.send; | 83 local _send = session.sends2s or session.send; |
| 84 local function new_send(stanza) | 84 local function new_send(stanza) |
| 85 local attr = stanza.attr; | 85 local attr = stanza.attr; |
| 86 if attr and not attr.xmlns then -- Stanza in default stream namespace | 86 if attr and not attr.xmlns then -- Stanza in default stream namespace |
| 87 local cached_stanza = st.clone(stanza); | 87 local cached_stanza = st.clone(stanza); |
| 88 | 88 |
| 89 if cached_stanza and cached_stanza:get_child("delay", xmlns_delay) == nil then | 89 if cached_stanza and cached_stanza:get_child("delay", xmlns_delay) == nil then |
| 90 cached_stanza = cached_stanza:tag("delay", { xmlns = xmlns_delay, from = session.host, stamp = datetime.datetime()}); | 90 cached_stanza = cached_stanza:tag("delay", { xmlns = xmlns_delay, from = session.host, stamp = datetime.datetime()}); |
| 91 end | 91 end |
| 92 | 92 |
| 93 queue[#queue+1] = cached_stanza; | 93 queue[#queue+1] = cached_stanza; |
| 94 end | 94 end |
| 95 if session.hibernating then | 95 if session.hibernating then |
| 96 -- The session is hibernating, no point in sending the stanza | 96 -- The session is hibernating, no point in sending the stanza |
| 97 -- over a dead connection. It will be delivered upon resumption. | 97 -- over a dead connection. It will be delivered upon resumption. |
| 102 session.awaiting_ack = true; | 102 session.awaiting_ack = true; |
| 103 return _send(st.stanza("r", sm_attr)); | 103 return _send(st.stanza("r", sm_attr)); |
| 104 end | 104 end |
| 105 return ok, err; | 105 return ok, err; |
| 106 end | 106 end |
| 107 | 107 |
| 108 if session.sends2s then | 108 if session.sends2s then |
| 109 session.sends2s = new_send; | 109 session.sends2s = new_send; |
| 110 else | 110 else |
| 111 session.send = new_send; | 111 session.send = new_send; |
| 112 end | 112 end |
| 117 session_registry[session.resumption_token] = nil; | 117 session_registry[session.resumption_token] = nil; |
| 118 session.resumption_token = nil; | 118 session.resumption_token = nil; |
| 119 end | 119 end |
| 120 return session_close(...); | 120 return session_close(...); |
| 121 end | 121 end |
| 122 | 122 |
| 123 if not resume then | 123 if not resume then |
| 124 session.handled_stanza_count = 0; | 124 session.handled_stanza_count = 0; |
| 125 add_filter(session, "stanzas/in", function (stanza) | 125 add_filter(session, "stanzas/in", function (stanza) |
| 126 if not stanza.attr.xmlns then | 126 if not stanza.attr.xmlns then |
| 127 session.handled_stanza_count = session.handled_stanza_count + 1; | 127 session.handled_stanza_count = session.handled_stanza_count + 1; |
| 142 return true; | 142 return true; |
| 143 end | 143 end |
| 144 | 144 |
| 145 module:log("debug", "Enabling stream management"); | 145 module:log("debug", "Enabling stream management"); |
| 146 session.smacks = true; | 146 session.smacks = true; |
| 147 | 147 |
| 148 wrap_session(session, false, xmlns_sm); | 148 wrap_session(session, false, xmlns_sm); |
| 149 | 149 |
| 150 local resume_token; | 150 local resume_token; |
| 151 local resume = stanza.attr.resume; | 151 local resume = stanza.attr.resume; |
| 152 if resume == "true" or resume == "1" then | 152 if resume == "true" or resume == "1" then |
| 153 resume_token = uuid_generate(); | 153 resume_token = uuid_generate(); |
| 154 session_registry[resume_token] = session; | 154 session_registry[resume_token] = session; |
| 161 module:hook_stanza(xmlns_sm3, "enable", function (session, stanza) return handle_enable(session, stanza, xmlns_sm3); end, 100); | 161 module:hook_stanza(xmlns_sm3, "enable", function (session, stanza) return handle_enable(session, stanza, xmlns_sm3); end, 100); |
| 162 | 162 |
| 163 function handle_enabled(session, stanza, xmlns_sm) | 163 function handle_enabled(session, stanza, xmlns_sm) |
| 164 module:log("debug", "Enabling stream management"); | 164 module:log("debug", "Enabling stream management"); |
| 165 session.smacks = true; | 165 session.smacks = true; |
| 166 | 166 |
| 167 wrap_session(session, false, xmlns_sm); | 167 wrap_session(session, false, xmlns_sm); |
| 168 | 168 |
| 169 -- FIXME Resume? | 169 -- FIXME Resume? |
| 170 | 170 |
| 171 return true; | 171 return true; |
| 172 end | 172 end |
| 173 module:hook_stanza(xmlns_sm2, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm2); end, 100); | 173 module:hook_stanza(xmlns_sm2, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm2); end, 100); |
| 174 module:hook_stanza(xmlns_sm3, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm3); end, 100); | 174 module:hook_stanza(xmlns_sm3, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm3); end, 100); |
| 175 | 175 |
| 267 session.log("debug", "Session resumed before hibernation timeout, all is well") | 267 session.log("debug", "Session resumed before hibernation timeout, all is well") |
| 268 end | 268 end |
| 269 end); | 269 end); |
| 270 return true; -- Postpone destruction for now | 270 return true; -- Postpone destruction for now |
| 271 end | 271 end |
| 272 | 272 |
| 273 end | 273 end |
| 274 end); | 274 end); |
| 275 | 275 |
| 276 function handle_resume(session, stanza, xmlns_sm) | 276 function handle_resume(session, stanza, xmlns_sm) |
| 277 if session.full_jid then | 277 if session.full_jid then |
| 323 -- Similar for connlisteners | 323 -- Similar for connlisteners |
| 324 c2s_sessions[session.conn] = original_session; | 324 c2s_sessions[session.conn] = original_session; |
| 325 | 325 |
| 326 session.send(st.stanza("resumed", { xmlns = xmlns_sm, | 326 session.send(st.stanza("resumed", { xmlns = xmlns_sm, |
| 327 h = original_session.handled_stanza_count, previd = id })); | 327 h = original_session.handled_stanza_count, previd = id })); |
| 328 | 328 |
| 329 -- Fake an <a> with the h of the <resume/> from the client | 329 -- Fake an <a> with the h of the <resume/> from the client |
| 330 original_session:dispatch_stanza(st.stanza("a", { xmlns = xmlns_sm, | 330 original_session:dispatch_stanza(st.stanza("a", { xmlns = xmlns_sm, |
| 331 h = stanza.attr.h })); | 331 h = stanza.attr.h })); |
| 332 | 332 |
| 333 -- Ok, we need to re-send any stanzas that the client didn't see | 333 -- Ok, we need to re-send any stanzas that the client didn't see |
| 334 -- ...they are what is now left in the outgoing stanza queue | 334 -- ...they are what is now left in the outgoing stanza queue |
| 335 local queue = original_session.outgoing_stanza_queue; | 335 local queue = original_session.outgoing_stanza_queue; |
| 336 for i=1,#queue do | 336 for i=1,#queue do |
| 337 session.send(queue[i]); | 337 session.send(queue[i]); |
