123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import { _converse, api, converse } from "@converse/headless";
- const { Strophe, $iq } = converse.env;
- let lastStanzaDate;
- export function onWindowStateChanged (data) {
- data.state === 'visible' && api.ping(null, 5000);
- }
- export function setLastStanzaDate (date) {
- lastStanzaDate = date;
- }
- function pong (ping) {
- lastStanzaDate = new Date();
- const from = ping.getAttribute('from');
- const id = ping.getAttribute('id');
- const iq = $iq({type: 'result', to: from,id: id});
- _converse.connection.sendIQ(iq);
- return true;
- }
- export function registerPongHandler () {
- const { connection } = _converse;
- if (connection.disco) {
- api.disco.own.features.add(Strophe.NS.PING);
- }
- return connection.addHandler(pong, Strophe.NS.PING, "iq", "get");
- }
- export function registerPingHandler () {
- _converse.connection.addHandler(() => {
- if (api.settings.get('ping_interval') > 0) {
- // Handler on each stanza, saves the received date
- // in order to ping only when needed.
- lastStanzaDate = new Date();
- return true;
- }
- });
- }
- let intervalId;
- export function registerHandlers () {
- // Wrapper so that we can spy on registerPingHandler in tests
- registerPongHandler();
- registerPingHandler();
- clearInterval(intervalId);
- intervalId = setInterval(onEverySecond, 1000);
- }
- export function unregisterIntervalHandler () {
- clearInterval(intervalId);
- }
- export function onEverySecond () {
- if (_converse.isTestEnv() || !api.connection.authenticated()) {
- return;
- }
- const ping_interval = api.settings.get('ping_interval');
- if (ping_interval > 0) {
- const now = new Date();
- lastStanzaDate = lastStanzaDate ?? now;
- if ((now - lastStanzaDate)/1000 > ping_interval) {
- api.ping();
- }
- }
- }
|