converse-ping.js 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Converse.js
  2. // https://conversejs.org
  3. //
  4. // Copyright (c) 2013-2018, the Converse.js developers
  5. // Licensed under the Mozilla Public License (MPLv2)
  6. /* This is a Converse.js plugin which add support for application-level pings
  7. * as specified in XEP-0199 XMPP Ping.
  8. */
  9. (function (root, factory) {
  10. define(["./converse-core", "strophejs-plugin-ping"], factory);
  11. }(this, function (converse) {
  12. "use strict";
  13. // Strophe methods for building stanzas
  14. const { Strophe, _ } = converse.env;
  15. converse.plugins.add('converse-ping', {
  16. initialize () {
  17. /* The initialize function gets called as soon as the plugin is
  18. * loaded by converse.js's plugin machinery.
  19. */
  20. const { _converse } = this;
  21. _converse.api.settings.update({
  22. ping_interval: 180 //in seconds
  23. });
  24. _converse.ping = function (jid, success, error, timeout) {
  25. // XXX: We could first check here if the server advertised that
  26. // it supports PING.
  27. // However, some servers don't advertise while still keeping the
  28. // connection option due to pings.
  29. //
  30. // var feature = _converse.disco_entities[_converse.domain].features.findWhere({'var': Strophe.NS.PING});
  31. _converse.lastStanzaDate = new Date();
  32. if (_.isNil(jid)) {
  33. jid = Strophe.getDomainFromJid(_converse.bare_jid);
  34. }
  35. if (_.isUndefined(timeout) ) { timeout = null; }
  36. if (_.isUndefined(success) ) { success = null; }
  37. if (_.isUndefined(error) ) { error = null; }
  38. if (_converse.connection) {
  39. _converse.connection.ping.ping(jid, success, error, timeout);
  40. return true;
  41. }
  42. return false;
  43. };
  44. _converse.pong = function (ping) {
  45. _converse.lastStanzaDate = new Date();
  46. _converse.connection.ping.pong(ping);
  47. return true;
  48. };
  49. _converse.registerPongHandler = function () {
  50. if (!_.isUndefined(_converse.connection.disco)) {
  51. _converse.api.disco.own.features.add(Strophe.NS.PING);
  52. }
  53. _converse.connection.ping.addPingHandler(_converse.pong);
  54. };
  55. _converse.registerPingHandler = function () {
  56. _converse.registerPongHandler();
  57. if (_converse.ping_interval > 0) {
  58. _converse.connection.addHandler(function () {
  59. /* Handler on each stanza, saves the received date
  60. * in order to ping only when needed.
  61. */
  62. _converse.lastStanzaDate = new Date();
  63. return true;
  64. });
  65. _converse.connection.addTimedHandler(1000, function () {
  66. const now = new Date();
  67. if (!_converse.lastStanzaDate) {
  68. _converse.lastStanzaDate = now;
  69. }
  70. if ((now - _converse.lastStanzaDate)/1000 > _converse.ping_interval) {
  71. return _converse.ping();
  72. }
  73. return true;
  74. });
  75. }
  76. };
  77. const onConnected = function () {
  78. // Wrapper so that we can spy on registerPingHandler in tests
  79. _converse.registerPingHandler();
  80. };
  81. _converse.on('connected', onConnected);
  82. _converse.on('reconnected', onConnected);
  83. }
  84. });
  85. }));