utils.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { _converse, api, converse } from "@converse/headless";
  2. const { Strophe, $iq } = converse.env;
  3. let lastStanzaDate;
  4. export function onWindowStateChanged (data) {
  5. data.state === 'visible' && api.ping(null, 5000);
  6. }
  7. export function setLastStanzaDate (date) {
  8. lastStanzaDate = date;
  9. }
  10. function pong (ping) {
  11. lastStanzaDate = new Date();
  12. const from = ping.getAttribute('from');
  13. const id = ping.getAttribute('id');
  14. const iq = $iq({type: 'result', to: from,id: id});
  15. _converse.connection.sendIQ(iq);
  16. return true;
  17. }
  18. export function registerPongHandler () {
  19. const { connection } = _converse;
  20. if (connection.disco) {
  21. api.disco.own.features.add(Strophe.NS.PING);
  22. }
  23. return connection.addHandler(pong, Strophe.NS.PING, "iq", "get");
  24. }
  25. export function registerPingHandler () {
  26. _converse.connection.addHandler(() => {
  27. if (api.settings.get('ping_interval') > 0) {
  28. // Handler on each stanza, saves the received date
  29. // in order to ping only when needed.
  30. lastStanzaDate = new Date();
  31. return true;
  32. }
  33. });
  34. }
  35. let intervalId;
  36. export function registerHandlers () {
  37. // Wrapper so that we can spy on registerPingHandler in tests
  38. registerPongHandler();
  39. registerPingHandler();
  40. clearInterval(intervalId);
  41. intervalId = setInterval(onEverySecond, 1000);
  42. }
  43. export function unregisterIntervalHandler () {
  44. clearInterval(intervalId);
  45. }
  46. export function onEverySecond () {
  47. if (_converse.isTestEnv() || !api.connection.authenticated()) {
  48. return;
  49. }
  50. const ping_interval = api.settings.get('ping_interval');
  51. if (ping_interval > 0) {
  52. const now = new Date();
  53. lastStanzaDate = lastStanzaDate ?? now;
  54. if ((now - lastStanzaDate)/1000 > ping_interval) {
  55. api.ping();
  56. }
  57. }
  58. }