comparison mod_cloud_notify/mod_cloud_notify.lua @ 4273:8bf83e883593

mod_cloud_notify: Modernize interface to mod_smacks
author tmolitor <thilo@eightysoft.de>
date Tue, 24 Nov 2020 01:52:33 +0100
parents e5998f53f4ff
children d44a8d3dd571
comparison
equal deleted inserted replaced
4272:91b951fb3018 4273:8bf83e883593
405 if notified.unimportant and notified.important then break; end -- stop processing the queue if all push types are exhausted 405 if notified.unimportant and notified.important then break; end -- stop processing the queue if all push types are exhausted
406 end 406 end
407 end 407 end
408 408
409 -- publish on unacked smacks message (use timer to send out push for all stanzas submitted in a row only once) 409 -- publish on unacked smacks message (use timer to send out push for all stanzas submitted in a row only once)
410 local function process_smacks_stanza(stanza, session) 410 local function process_smacks_stanza(event)
411 local session = event.origin;
412 local stanza = event.stanza;
411 if session.push_identifier then 413 if session.push_identifier then
414 session.log("debug", "adding new stanza to push_queue");
412 if not session.push_queue then session.push_queue = {}; end 415 if not session.push_queue then session.push_queue = {}; end
413 local queue = session.push_queue; 416 local queue = session.push_queue;
414 queue[#queue+1] = st.clone(stanza); 417 queue[#queue+1] = st.clone(stanza);
415 if #queue == 1 then -- first stanza --> start timer 418 if #queue == 1 then -- first stanza --> start timer
416 session.log("debug", "Invoking cloud handle_notify_request() for newly smacks queued stanza (in a moment)"); 419 session.log("debug", "Invoking cloud handle_notify_request() for newly smacks queued stanza (in a moment)");
418 session.log("debug", "Invoking cloud handle_notify_request() for newly smacks queued stanzas (now in timer)"); 421 session.log("debug", "Invoking cloud handle_notify_request() for newly smacks queued stanzas (now in timer)");
419 process_stanza_queue(session.push_queue, session, "push"); 422 process_stanza_queue(session.push_queue, session, "push");
420 session.push_queue = {}; -- clean up queue after push 423 session.push_queue = {}; -- clean up queue after push
421 end); 424 end);
422 end 425 end
426 else
427 session.log("debug", "NOT invoking cloud handle_notify_request() for newly smacks queued stanza (session.push_identifier is not set: %s)", session.push_identifier);
423 end 428 end
424 return stanza; 429 return stanza;
425 end 430 end
426 431
427 -- smacks hibernation is started 432 -- smacks hibernation is started
429 local session = event.origin; 434 local session = event.origin;
430 local queue = event.queue; 435 local queue = event.queue;
431 session.first_hibernated_push = nil; 436 session.first_hibernated_push = nil;
432 -- process unacked stanzas 437 -- process unacked stanzas
433 process_stanza_queue(queue, session, "smacks"); 438 process_stanza_queue(queue, session, "smacks");
434 -- process future unacked (hibernated) stanzas
435 filters.add_filter(session, "stanzas/out", process_smacks_stanza, -990);
436 end 439 end
437 440
438 -- smacks hibernation is ended 441 -- smacks hibernation is ended
439 local function restore_session(event) 442 local function restore_session(event)
440 local session = event.resumed; 443 local session = event.resumed;
441 if session then -- older smacks module versions send only the "intermediate" session in event.session and no session.resumed one 444 if session then -- older smacks module versions send only the "intermediate" session in event.session and no session.resumed one
442 filters.remove_filter(session, "stanzas/out", process_smacks_stanza);
443 if session.awaiting_push_timer then session.awaiting_push_timer:stop(); end 445 if session.awaiting_push_timer then session.awaiting_push_timer:stop(); end
444 session.first_hibernated_push = nil; 446 session.first_hibernated_push = nil;
445 end 447 end
446 end 448 end
447 449
490 end 492 end
491 493
492 module:hook("smacks-hibernation-start", hibernate_session); 494 module:hook("smacks-hibernation-start", hibernate_session);
493 module:hook("smacks-hibernation-end", restore_session); 495 module:hook("smacks-hibernation-end", restore_session);
494 module:hook("smacks-ack-delayed", ack_delayed); 496 module:hook("smacks-ack-delayed", ack_delayed);
497 module:hook("smacks-hibernation-stanza-queued", process_smacks_stanza);
495 module:hook("archive-message-added", archive_message_added); 498 module:hook("archive-message-added", archive_message_added);
496 499
497 local function send_ping(event) 500 local function send_ping(event)
498 local user = event.user; 501 local user = event.user;
499 local push_services = event.push_services or push_store:get(user); 502 local push_services = event.push_services or push_store:get(user);
504 -- can be used by other modules to ping one or more (or all) push endpoints 507 -- can be used by other modules to ping one or more (or all) push endpoints
505 module:hook("cloud-notify-ping", send_ping); 508 module:hook("cloud-notify-ping", send_ping);
506 509
507 module:log("info", "Module loaded"); 510 module:log("info", "Module loaded");
508 function module.unload() 511 function module.unload()
512 module:log("info", "Unloading module");
513 -- cleanup some settings, reloading this module can cause process_smacks_stanza() to stop working otherwise
514 for user, _ in pairs(host_sessions) do
515 for sessionid, session in pairs(host_sessions[user].sessions) do
516 if session.awaiting_push_timer then session.awaiting_push_timer:stop(); end
517 session.awaiting_push_timer = nil;
518 session.first_hibernated_push = nil;
519 session.push_queue = nil;
520 end
521 end
509 module:log("info", "Module unloaded"); 522 module:log("info", "Module unloaded");
510 end 523 end