@pazznetwork/ngx-chat
Version:
[](https://travis-ci.com/pazznetwork/ngx-chat) [](https://coveralls.io/github/pazzn
44 lines • 7.37 kB
JavaScript
import { xml } from '@xmpp/client';
import { filter } from 'rxjs/operators';
import { timeout } from '../../../../core/utils-timeout';
import { AbstractXmppPlugin } from './abstract-xmpp-plugin';
/**
* XEP-0199 XMPP Ping (https://xmpp.org/extensions/xep-0199.html)
*/
export class PingPlugin extends AbstractXmppPlugin {
constructor(xmppChatAdapter, logService, ngZone) {
super();
this.xmppChatAdapter = xmppChatAdapter;
this.logService = logService;
this.ngZone = ngZone;
this.pingInterval = 60000;
this.xmppChatAdapter.state$.pipe(filter(newState => newState === 'online')).subscribe(() => this.schedulePings());
this.xmppChatAdapter.state$.pipe(filter(newState => newState === 'disconnected')).subscribe(() => this.unschedulePings());
}
schedulePings() {
this.unschedulePings();
this.ngZone.runOutsideAngular(() => {
this.timeoutHandle = window.setInterval(() => this.ping(), this.pingInterval);
});
}
async ping() {
this.logService.debug('ping...');
try {
await timeout(this.sendPing(), 10000);
this.logService.debug('... pong');
}
catch {
if (this.xmppChatAdapter.state$.getValue() === 'online'
&& this.xmppChatAdapter.chatConnectionService.state$.getValue() === 'online') {
this.logService.error('... pong errored, connection should be online, waiting for browser websocket timeout');
}
}
}
async sendPing() {
return await this.xmppChatAdapter.chatConnectionService.sendIq(xml('iq', { type: 'get' }, xml('ping', { xmlns: 'urn:xmpp:ping' })));
}
unschedulePings() {
window.clearInterval(this.timeoutHandle);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGluZy5wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2FkYXB0ZXJzL3htcHAvcGx1Z2lucy9waW5nLnBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHNUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sVUFBVyxTQUFRLGtCQUFrQjtJQUs5QyxZQUNxQixlQUFnQyxFQUNoQyxVQUFzQixFQUN0QixNQUFjO1FBRS9CLEtBQUssRUFBRSxDQUFDO1FBSlMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUxsQixpQkFBWSxHQUFHLEtBQU0sQ0FBQztRQVNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQzVCLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FDNUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUM1QixNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssY0FBYyxDQUFDLENBQ2xELENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTyxhQUFhO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxLQUFLLENBQUMsSUFBSTtRQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLElBQUk7WUFDQSxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBTSxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDckM7UUFBQyxNQUFNO1lBQ0osSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxRQUFRO21CQUNoRCxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxRQUFRLEVBQUU7Z0JBQzlFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7YUFDbEg7U0FDSjtJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsUUFBUTtRQUNsQixPQUFPLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQzFELEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLEVBQ25CLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsZUFBZSxFQUFDLENBQUMsQ0FDeEMsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVPLGVBQWU7UUFDbkIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB4bWwgfSBmcm9tICdAeG1wcC9jbGllbnQnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgdGltZW91dCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdXRpbHMtdGltZW91dCc7XG5pbXBvcnQgeyBMb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgWG1wcENoYXRBZGFwdGVyIH0gZnJvbSAnLi4veG1wcC1jaGF0LWFkYXB0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFhtcHBQbHVnaW4gfSBmcm9tICcuL2Fic3RyYWN0LXhtcHAtcGx1Z2luJztcbmltcG9ydCB7IElxUmVzcG9uc2VTdGFuemEgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3N0YW56YSc7XG5cbi8qKlxuICogWEVQLTAxOTkgWE1QUCBQaW5nIChodHRwczovL3htcHAub3JnL2V4dGVuc2lvbnMveGVwLTAxOTkuaHRtbClcbiAqL1xuZXhwb3J0IGNsYXNzIFBpbmdQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFhtcHBQbHVnaW4ge1xuXG4gICAgcHJpdmF0ZSB0aW1lb3V0SGFuZGxlOiBhbnk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwaW5nSW50ZXJ2YWwgPSA2MF8wMDA7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB4bXBwQ2hhdEFkYXB0ZXI6IFhtcHBDaGF0QWRhcHRlcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMueG1wcENoYXRBZGFwdGVyLnN0YXRlJC5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKG5ld1N0YXRlID0+IG5ld1N0YXRlID09PSAnb25saW5lJyksXG4gICAgICAgICkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2NoZWR1bGVQaW5ncygpKTtcblxuICAgICAgICB0aGlzLnhtcHBDaGF0QWRhcHRlci5zdGF0ZSQucGlwZShcbiAgICAgICAgICAgIGZpbHRlcihuZXdTdGF0ZSA9PiBuZXdTdGF0ZSA9PT0gJ2Rpc2Nvbm5lY3RlZCcpLFxuICAgICAgICApLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVuc2NoZWR1bGVQaW5ncygpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjaGVkdWxlUGluZ3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudW5zY2hlZHVsZVBpbmdzKCk7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudGltZW91dEhhbmRsZSA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnBpbmcoKSwgdGhpcy5waW5nSW50ZXJ2YWwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHBpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMubG9nU2VydmljZS5kZWJ1ZygncGluZy4uLicpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGltZW91dCh0aGlzLnNlbmRQaW5nKCksIDEwXzAwMCk7XG4gICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZGVidWcoJy4uLiBwb25nJyk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgaWYgKHRoaXMueG1wcENoYXRBZGFwdGVyLnN0YXRlJC5nZXRWYWx1ZSgpID09PSAnb25saW5lJ1xuICAgICAgICAgICAgICAgICYmIHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS5zdGF0ZSQuZ2V0VmFsdWUoKSA9PT0gJ29ubGluZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoJy4uLiBwb25nIGVycm9yZWQsICBjb25uZWN0aW9uIHNob3VsZCBiZSBvbmxpbmUsIHdhaXRpbmcgZm9yIGJyb3dzZXIgd2Vic29ja2V0IHRpbWVvdXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2VuZFBpbmcoKTogUHJvbWlzZTxJcVJlc3BvbnNlU3RhbnphPCdyZXN1bHQnPj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy54bXBwQ2hhdEFkYXB0ZXIuY2hhdENvbm5lY3Rpb25TZXJ2aWNlLnNlbmRJcShcbiAgICAgICAgICAgIHhtbCgnaXEnLCB7dHlwZTogJ2dldCd9LFxuICAgICAgICAgICAgICAgIHhtbCgncGluZycsIHt4bWxuczogJ3Vybjp4bXBwOnBpbmcnfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVuc2NoZWR1bGVQaW5ncygpOiB2b2lkIHtcbiAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50aW1lb3V0SGFuZGxlKTtcbiAgICB9XG5cbn1cbiJdfQ==