@pazznetwork/ngx-chat
Version:
[](https://travis-ci.com/pazznetwork/ngx-chat) [](https://coveralls.io/github/pazzn
78 lines • 12.6 kB
JavaScript
import { xml } from '@xmpp/client';
import { BehaviorSubject } from 'rxjs';
import { AbstractXmppPlugin } from './abstract-xmpp-plugin';
/**
* XEP-0191: Blocking Command
* https://xmpp.org/extensions/xep-0191.html
*/
export class BlockPlugin extends AbstractXmppPlugin {
constructor(xmppChatAdapter, serviceDiscoveryPlugin) {
super();
this.xmppChatAdapter = xmppChatAdapter;
this.serviceDiscoveryPlugin = serviceDiscoveryPlugin;
this.supportsBlock$ = new BehaviorSubject('unknown');
}
async onBeforeOnline() {
const supportsBlock = await this.determineSupportForBlock();
this.supportsBlock$.next(supportsBlock);
if (supportsBlock) {
await this.requestBlockedJids();
}
}
async determineSupportForBlock() {
try {
return await this.serviceDiscoveryPlugin.supportsFeature(this.xmppChatAdapter.chatConnectionService.userJid.domain, 'urn:xmpp:blocking');
}
catch (e) {
return false;
}
}
onOffline() {
this.supportsBlock$.next('unknown');
this.xmppChatAdapter.blockedContactIds$.next(new Set());
}
blockJid(jid) {
return this.xmppChatAdapter.chatConnectionService.sendIq(xml('iq', { type: 'set' }, xml('block', { xmlns: 'urn:xmpp:blocking' }, xml('item', { jid }))));
}
unblockJid(jid) {
return this.xmppChatAdapter.chatConnectionService.sendIq(xml('iq', { type: 'set' }, xml('unblock', { xmlns: 'urn:xmpp:blocking' }, xml('item', { jid }))));
}
async requestBlockedJids() {
const blockListResponse = await this.xmppChatAdapter.chatConnectionService.sendIq(xml('iq', { type: 'get' }, xml('blocklist', { xmlns: 'urn:xmpp:blocking' })));
const blockedJids = blockListResponse
.getChild('blocklist')
.getChildren('item')
.map(e => e.attrs.jid);
this.xmppChatAdapter.blockedContactIds$.next(new Set(blockedJids));
}
handleStanza(stanza) {
const { from } = stanza.attrs;
if (from && from === this.xmppChatAdapter.chatConnectionService.userJid?.bare().toString()) {
const blockPush = stanza.getChild('block', 'urn:xmpp:blocking');
const unblockPush = stanza.getChild('unblock', 'urn:xmpp:blocking');
const blockList = this.xmppChatAdapter.blockedContactIds$.getValue();
if (blockPush) {
blockPush.getChildren('item')
.map(e => e.attrs.jid)
.forEach(jid => blockList.add(jid));
this.xmppChatAdapter.blockedContactIds$.next(blockList);
return true;
}
else if (unblockPush) {
const jidsToUnblock = unblockPush.getChildren('item').map(e => e.attrs.jid);
if (jidsToUnblock.length === 0) {
// unblock everyone
blockList.clear();
}
else {
// unblock individually
jidsToUnblock.forEach(jid => blockList.delete(jid));
}
this.xmppChatAdapter.blockedContactIds$.next(blockList);
return true;
}
}
return false;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2sucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hZGFwdGVycy94bXBwL3BsdWdpbnMvYmxvY2sucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUd2QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUc1RDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLGtCQUFrQjtJQUkvQyxZQUNZLGVBQWdDLEVBQ2hDLHNCQUE4QztRQUV0RCxLQUFLLEVBQUUsQ0FBQztRQUhBLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBSm5ELG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQXNCLFNBQVMsQ0FBQyxDQUFDO0lBTzVFLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYztRQUNoQixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hDLElBQUksYUFBYSxFQUFFO1lBQ2YsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUNuQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsd0JBQXdCO1FBQ2xDLElBQUk7WUFDQSxPQUFPLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FDcEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUN6RCxtQkFBbUIsQ0FBQyxDQUFDO1NBQzVCO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDUixPQUFPLEtBQUss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V0FBVyxFQUFFO2dCQUNwQixNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBYSxDQUFDLENBQUM7Z0JBQ3RGLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQzVCLG1CQUFtQjtvQkFDbkIsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUNyQjtxQkFBTTtvQkFDSCx1QkFBdUI7b0JBQ3ZCLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEO2dCQUNELElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN4RCxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0NBRUoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB4bWwgfSBmcm9tICdAeG1wcC9jbGllbnQnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdGFuemEgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3N0YW56YSc7XG5pbXBvcnQgeyBYbXBwQ2hhdEFkYXB0ZXIgfSBmcm9tICcuLi94bXBwLWNoYXQtYWRhcHRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEFic3RyYWN0WG1wcFBsdWdpbiB9IGZyb20gJy4vYWJzdHJhY3QteG1wcC1wbHVnaW4nO1xuaW1wb3J0IHsgU2VydmljZURpc2NvdmVyeVBsdWdpbiB9IGZyb20gJy4vc2VydmljZS1kaXNjb3ZlcnkucGx1Z2luJztcblxuLyoqXG4gKiBYRVAtMDE5MTogQmxvY2tpbmcgQ29tbWFuZFxuICogaHR0cHM6Ly94bXBwLm9yZy9leHRlbnNpb25zL3hlcC0wMTkxLmh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIEJsb2NrUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RYbXBwUGx1Z2luIHtcblxuICAgIHB1YmxpYyBzdXBwb3J0c0Jsb2NrJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbiB8ICd1bmtub3duJz4oJ3Vua25vd24nKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHhtcHBDaGF0QWRhcHRlcjogWG1wcENoYXRBZGFwdGVyLFxuICAgICAgICBwcml2YXRlIHNlcnZpY2VEaXNjb3ZlcnlQbHVnaW46IFNlcnZpY2VEaXNjb3ZlcnlQbHVnaW4sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25CZWZvcmVPbmxpbmUoKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRzQmxvY2sgPSBhd2FpdCB0aGlzLmRldGVybWluZVN1cHBvcnRGb3JCbG9jaygpO1xuICAgICAgICB0aGlzLnN1cHBvcnRzQmxvY2skLm5leHQoc3VwcG9ydHNCbG9jayk7XG4gICAgICAgIGlmIChzdXBwb3J0c0Jsb2NrKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RCbG9ja2VkSmlkcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkZXRlcm1pbmVTdXBwb3J0Rm9yQmxvY2soKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJ2aWNlRGlzY292ZXJ5UGx1Z2luLnN1cHBvcnRzRmVhdHVyZShcbiAgICAgICAgICAgICAgICB0aGlzLnhtcHBDaGF0QWRhcHRlci5jaGF0Q29ubmVjdGlvblNlcnZpY2UudXNlckppZC5kb21haW4sXG4gICAgICAgICAgICAgICAgJ3Vybjp4bXBwOmJsb2NraW5nJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uT2ZmbGluZSgpIHtcbiAgICAgICAgdGhpcy5zdXBwb3J0c0Jsb2NrJC5uZXh0KCd1bmtub3duJyk7XG4gICAgICAgIHRoaXMueG1wcENoYXRBZGFwdGVyLmJsb2NrZWRDb250YWN0SWRzJC5uZXh0KG5ldyBTZXQ8c3RyaW5nPigpKTtcbiAgICB9XG5cbiAgICBibG9ja0ppZChqaWQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy54bXBwQ2hhdEFkYXB0ZXIuY2hhdENvbm5lY3Rpb25TZXJ2aWNlLnNlbmRJcShcbiAgICAgICAgICAgIHhtbCgnaXEnLCB7dHlwZTogJ3NldCd9LFxuICAgICAgICAgICAgICAgIHhtbCgnYmxvY2snLCB7eG1sbnM6ICd1cm46eG1wcDpibG9ja2luZyd9LFxuICAgICAgICAgICAgICAgICAgICB4bWwoJ2l0ZW0nLCB7amlkfSkpKSk7XG4gICAgfVxuXG4gICAgdW5ibG9ja0ppZChqaWQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy54bXBwQ2hhdEFkYXB0ZXIuY2hhdENvbm5lY3Rpb25TZXJ2aWNlLnNlbmRJcShcbiAgICAgICAgICAgIHhtbCgnaXEnLCB7dHlwZTogJ3NldCd9LFxuICAgICAgICAgICAgICAgIHhtbCgndW5ibG9jaycsIHt4bWxuczogJ3Vybjp4bXBwOmJsb2NraW5nJ30sXG4gICAgICAgICAgICAgICAgICAgIHhtbCgnaXRlbScsIHtqaWR9KSkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlcXVlc3RCbG9ja2VkSmlkcygpIHtcbiAgICAgICAgY29uc3QgYmxvY2tMaXN0UmVzcG9uc2UgPSBhd2FpdCB0aGlzLnhtcHBDaGF0QWRhcHRlci5jaGF0Q29ubmVjdGlvblNlcnZpY2Uuc2VuZElxKFxuICAgICAgICAgICAgeG1sKCdpcScsIHt0eXBlOiAnZ2V0J30sXG4gICAgICAgICAgICAgICAgeG1sKCdibG9ja2xpc3QnLCB7eG1sbnM6ICd1cm46eG1wcDpibG9ja2luZyd9KVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJsb2NrZWRKaWRzID0gYmxvY2tMaXN0UmVzcG9uc2VcbiAgICAgICAgICAgIC5nZXRDaGlsZCgnYmxvY2tsaXN0JylcbiAgICAgICAgICAgIC5nZXRDaGlsZHJlbignaXRlbScpXG4gICAgICAgICAgICAubWFwKGUgPT4gZS5hdHRycy5qaWQpO1xuXG4gICAgICAgIHRoaXMueG1wcENoYXRBZGFwdGVyLmJsb2NrZWRDb250YWN0SWRzJC5uZXh0KG5ldyBTZXQ8c3RyaW5nPihibG9ja2VkSmlkcykpO1xuICAgIH1cblxuICAgIGhhbmRsZVN0YW56YShzdGFuemE6IFN0YW56YSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7ZnJvbX0gPSBzdGFuemEuYXR0cnM7XG4gICAgICAgIGlmIChmcm9tICYmIGZyb20gPT09IHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS51c2VySmlkPy5iYXJlKCkudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tQdXNoID0gc3RhbnphLmdldENoaWxkKCdibG9jaycsICd1cm46eG1wcDpibG9ja2luZycpO1xuICAgICAgICAgICAgY29uc3QgdW5ibG9ja1B1c2ggPSBzdGFuemEuZ2V0Q2hpbGQoJ3VuYmxvY2snLCAndXJuOnhtcHA6YmxvY2tpbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrTGlzdCA9IHRoaXMueG1wcENoYXRBZGFwdGVyLmJsb2NrZWRDb250YWN0SWRzJC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKGJsb2NrUHVzaCkge1xuICAgICAgICAgICAgICAgIGJsb2NrUHVzaC5nZXRDaGlsZHJlbignaXRlbScpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoZSA9PiBlLmF0dHJzLmppZCBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGppZCA9PiBibG9ja0xpc3QuYWRkKGppZCkpO1xuICAgICAgICAgICAgICAgIHRoaXMueG1wcENoYXRBZGFwdGVyLmJsb2NrZWRDb250YWN0SWRzJC5uZXh0KGJsb2NrTGlzdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHVuYmxvY2tQdXNoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgamlkc1RvVW5ibG9jayA9IHVuYmxvY2tQdXNoLmdldENoaWxkcmVuKCdpdGVtJykubWFwKGUgPT4gZS5hdHRycy5qaWQgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAoamlkc1RvVW5ibG9jay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdW5ibG9jayBldmVyeW9uZVxuICAgICAgICAgICAgICAgICAgICBibG9ja0xpc3QuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB1bmJsb2NrIGluZGl2aWR1YWxseVxuICAgICAgICAgICAgICAgICAgICBqaWRzVG9VbmJsb2NrLmZvckVhY2goamlkID0+IGJsb2NrTGlzdC5kZWxldGUoamlkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMueG1wcENoYXRBZGFwdGVyLmJsb2NrZWRDb250YWN0SWRzJC5uZXh0KGJsb2NrTGlzdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxufVxuIl19