300 return true; |
300 return true; |
301 end |
301 end |
302 |
302 |
303 if session.username then |
303 if session.username then |
304 local old_sessions, err = all_old_sessions:get(session.username); |
304 local old_sessions, err = all_old_sessions:get(session.username); |
305 module:log("debug", "Old sessions: %q", old_sessions) |
305 session.log("debug", "Old sessions: %q", old_sessions) |
306 if old_sessions then |
306 if old_sessions then |
307 local keep, count = {}, 0; |
307 local keep, count = {}, 0; |
308 for token, info in it.sorted_pairs(old_sessions, function(a, b) |
308 for token, info in it.sorted_pairs(old_sessions, function(a, b) |
309 return (old_sessions[a].t or 0) > (old_sessions[b].t or 0); |
309 return (old_sessions[a].t or 0) > (old_sessions[b].t or 0); |
310 end) do |
310 end) do |
312 if count > max_old_sessions then break end |
312 if count > max_old_sessions then break end |
313 keep[token] = info; |
313 keep[token] = info; |
314 end |
314 end |
315 all_old_sessions:set(session.username, keep); |
315 all_old_sessions:set(session.username, keep); |
316 elseif err then |
316 elseif err then |
317 module:log("error", "Unable to retrieve old resumption counters: %s", err); |
317 session.log("error", "Unable to retrieve old resumption counters: %s", err); |
318 end |
318 end |
319 end |
319 end |
320 |
320 |
321 module:log("debug", "Enabling stream management"); |
321 session.log("debug", "Enabling stream management"); |
322 session.smacks = xmlns_sm; |
322 session.smacks = xmlns_sm; |
323 |
323 |
324 wrap_session(session, false); |
324 wrap_session(session, false); |
325 |
325 |
326 local resume_max; |
326 local resume_max; |
351 wrap_session_out(session, false); |
351 wrap_session_out(session, false); |
352 session.sends2s(st.stanza("enable", { xmlns = session.smacks })); |
352 session.sends2s(st.stanza("enable", { xmlns = session.smacks })); |
353 end); |
353 end); |
354 |
354 |
355 function handle_enabled(session, stanza, xmlns_sm) -- luacheck: ignore 212/stanza |
355 function handle_enabled(session, stanza, xmlns_sm) -- luacheck: ignore 212/stanza |
356 module:log("debug", "Enabling stream management"); |
356 session.log("debug", "Enabling stream management"); |
357 session.smacks = xmlns_sm; |
357 session.smacks = xmlns_sm; |
358 |
358 |
359 wrap_session_in(session, false); |
359 wrap_session_in(session, false); |
360 |
360 |
361 -- FIXME Resume? |
361 -- FIXME Resume? |
365 module:hook_tag(xmlns_sm2, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm2); end, 100); |
365 module:hook_tag(xmlns_sm2, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm2); end, 100); |
366 module:hook_tag(xmlns_sm3, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm3); end, 100); |
366 module:hook_tag(xmlns_sm3, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm3); end, 100); |
367 |
367 |
368 function handle_r(origin, stanza, xmlns_sm) -- luacheck: ignore 212/stanza |
368 function handle_r(origin, stanza, xmlns_sm) -- luacheck: ignore 212/stanza |
369 if not origin.smacks then |
369 if not origin.smacks then |
370 module:log("debug", "Received ack request from non-smack-enabled session"); |
370 origin.log("debug", "Received ack request from non-smack-enabled session"); |
371 return; |
371 return; |
372 end |
372 end |
373 module:log("debug", "Received ack request, acking for %d", origin.handled_stanza_count); |
373 origin.log("debug", "Received ack request, acking for %d", origin.handled_stanza_count); |
374 -- Reply with <a> |
374 -- Reply with <a> |
375 (origin.sends2s or origin.send)(st.stanza("a", { xmlns = xmlns_sm, h = format_h(origin.handled_stanza_count) })); |
375 (origin.sends2s or origin.send)(st.stanza("a", { xmlns = xmlns_sm, h = format_h(origin.handled_stanza_count) })); |
376 -- piggyback our own ack request if needed (see request_ack_if_needed() for explanation of last_requested_h) |
376 -- piggyback our own ack request if needed (see request_ack_if_needed() for explanation of last_requested_h) |
377 request_ack_now_if_needed(origin, false, "piggybacked by handle_r", nil); |
377 request_ack_now_if_needed(origin, false, "piggybacked by handle_r", nil); |
378 return true; |
378 return true; |